From c5c9a435fd4042f819d3c227fcc2af56c63dd8c7 Mon Sep 17 00:00:00 2001 From: Ramin Date: Wed, 24 Apr 2024 20:27:39 +0330 Subject: [PATCH 1/6] fix recurring donation count --- .../recurringDonationRepository.test.ts | 8 ++++---- src/repositories/recurringDonationRepository.ts | 13 +++++++++---- src/resolvers/donationResolver.ts | 4 ++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/repositories/recurringDonationRepository.test.ts b/src/repositories/recurringDonationRepository.test.ts index e8b49bc0d..7669bb9df 100644 --- a/src/repositories/recurringDonationRepository.test.ts +++ b/src/repositories/recurringDonationRepository.test.ts @@ -12,7 +12,7 @@ import { import { NETWORK_IDS } from '../provider'; import { addNewAnchorAddress } from './anchorContractAddressRepository'; import { - countOfActiveRecurringDonationsByProjectId, + nonZeroRecurringDonationsByProjectId, createNewRecurringDonation, findRecurringDonationById, findRecurringDonationByProjectIdAndUserIdAndCurrency, @@ -263,7 +263,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { }); recurringDonation.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation.save(); - const count = await countOfActiveRecurringDonationsByProjectId(project.id); + const count = await nonZeroRecurringDonationsByProjectId(project.id); assert.equal(count, 1); }); it('should return count correctly, when there is more than 1 active recurring donation', async () => { @@ -316,7 +316,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { recurringDonation2.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation2.save(); - const count = await countOfActiveRecurringDonationsByProjectId(project.id); + const count = await nonZeroRecurringDonationsByProjectId(project.id); assert.equal(count, 2); }); it('should return count correctly, when there is active and non active donations', async () => { @@ -398,7 +398,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { recurringDonation4.status = RECURRING_DONATION_STATUS.FAILED; await recurringDonation4.save(); - const count = await countOfActiveRecurringDonationsByProjectId(project.id); + const count = await nonZeroRecurringDonationsByProjectId(project.id); assert.equal(count, 1); }); } diff --git a/src/repositories/recurringDonationRepository.ts b/src/repositories/recurringDonationRepository.ts index 0635dba4b..2cc8a4fdd 100644 --- a/src/repositories/recurringDonationRepository.ts +++ b/src/repositories/recurringDonationRepository.ts @@ -129,14 +129,19 @@ export const findRecurringDonationById = async ( .getOne(); }; -export const countOfActiveRecurringDonationsByProjectId = async ( +export const nonZeroRecurringDonationsByProjectId = async ( projectId: number, ): Promise => { return await RecurringDonation.createQueryBuilder('recurringDonation') .where(`recurringDonation.projectId = :projectId`, { projectId }) - .andWhere(`recurringDonation.status = :status`, { - status: RECURRING_DONATION_STATUS.ACTIVE, - }) + .andWhere( + `(recurringDonation.status = :activeStatus OR + (recurringDonation.status = :endedStatus AND recurringDonation.totalAmountStreamed > 0))`, + { + activeStatus: RECURRING_DONATION_STATUS.ACTIVE, + endedStatus: RECURRING_DONATION_STATUS.ENDED, + }, + ) .getCount(); }; diff --git a/src/resolvers/donationResolver.ts b/src/resolvers/donationResolver.ts index fe23bf45e..57c665513 100644 --- a/src/resolvers/donationResolver.ts +++ b/src/resolvers/donationResolver.ts @@ -68,7 +68,7 @@ import { DRAFT_DONATION_STATUS, DraftDonation, } from '../entities/draftDonation'; -import { countOfActiveRecurringDonationsByProjectId } from '../repositories/recurringDonationRepository'; +import { nonZeroRecurringDonationsByProjectId } from '../repositories/recurringDonationRepository'; const draftDonationEnabled = process.env.ENABLE_DRAFT_DONATION === 'true'; @@ -590,7 +590,7 @@ export class DonationResolver { } const recurringDonationsCount = - await countOfActiveRecurringDonationsByProjectId(projectId); + await nonZeroRecurringDonationsByProjectId(projectId); const [donations, donationsCount] = await query .take(take) From b1600f0cddf283a5ef10289fb7018868168bc7a5 Mon Sep 17 00:00:00 2001 From: Ramin Date: Thu, 25 Apr 2024 16:04:47 +0330 Subject: [PATCH 2/6] fix query error --- src/repositories/recurringDonationRepository.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/repositories/recurringDonationRepository.ts b/src/repositories/recurringDonationRepository.ts index 2cc8a4fdd..97bab373b 100644 --- a/src/repositories/recurringDonationRepository.ts +++ b/src/repositories/recurringDonationRepository.ts @@ -134,14 +134,7 @@ export const nonZeroRecurringDonationsByProjectId = async ( ): Promise => { return await RecurringDonation.createQueryBuilder('recurringDonation') .where(`recurringDonation.projectId = :projectId`, { projectId }) - .andWhere( - `(recurringDonation.status = :activeStatus OR - (recurringDonation.status = :endedStatus AND recurringDonation.totalAmountStreamed > 0))`, - { - activeStatus: RECURRING_DONATION_STATUS.ACTIVE, - endedStatus: RECURRING_DONATION_STATUS.ENDED, - }, - ) + .andWhere('recurringDonation.totalUsdStreamed > 0') .getCount(); }; From 67c83b03a46ac8903c260d7c08c04d6cc2152ad2 Mon Sep 17 00:00:00 2001 From: Ramin Date: Thu, 25 Apr 2024 17:01:09 +0330 Subject: [PATCH 3/6] fix user donations count --- src/entities/user.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/entities/user.ts b/src/entities/user.ts index f3ea71cab..311f18d28 100644 --- a/src/entities/user.ts +++ b/src/entities/user.ts @@ -20,10 +20,7 @@ import { ProjectVerificationForm } from './projectVerificationForm'; import { PowerBoosting } from './powerBoosting'; import { findPowerBoostingsCountByUserId } from '../repositories/powerBoostingRepository'; import { ReferredEvent } from './referredEvent'; -import { - RECURRING_DONATION_STATUS, - RecurringDonation, -} from './recurringDonation'; +import { RecurringDonation } from './recurringDonation'; import { NOTIFICATIONS_EVENT_NAMES } from '../analytics/analytics'; export const publicSelectionFields = [ @@ -224,9 +221,7 @@ export class User extends BaseEntity { 'recurring_donation', ) .where(`recurring_donation."donorId" = :donorId`, { donorId: this.id }) - .andWhere(`recurring_donation.status = :status`, { - status: RECURRING_DONATION_STATUS.ACTIVE, - }) + .andWhere('recurringDonation.totalUsdStreamed > 0') .getCount(); // Sum of both counts From 26ebee384a5423f5aa9550f54650ec36194c09cf Mon Sep 17 00:00:00 2001 From: Ramin Date: Fri, 26 Apr 2024 23:02:42 +0330 Subject: [PATCH 4/6] fix recurring donation count tests --- .../recurringDonationRepository.test.ts | 23 +++++++++++++++++-- .../recurringDonationRepository.ts | 4 +++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/repositories/recurringDonationRepository.test.ts b/src/repositories/recurringDonationRepository.test.ts index 7669bb9df..60c29f122 100644 --- a/src/repositories/recurringDonationRepository.test.ts +++ b/src/repositories/recurringDonationRepository.test.ts @@ -256,6 +256,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { donor: creator, anchorContractAddress, flowRate: '100', + totalUsdStreamed: 1, currency, project, anonymous: false, @@ -298,6 +299,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); recurringDonation.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation.save(); @@ -312,6 +314,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); recurringDonation2.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation2.save(); @@ -341,6 +344,21 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { }); const currency = 'USD'; + const recurringDonation0 = await createNewRecurringDonation({ + txHash: generateRandomEvmTxHash(), + networkId: NETWORK_IDS.OPTIMISTIC, + donor: creator, + anchorContractAddress, + flowRate: '100', + currency, + project, + anonymous: false, + isBatch: false, + totalUsdStreamed: 0, + }); + recurringDonation0.status = RECURRING_DONATION_STATUS.ACTIVE; + await recurringDonation0.save(); + const recurringDonation1 = await createNewRecurringDonation({ txHash: generateRandomEvmTxHash(), networkId: NETWORK_IDS.OPTIMISTIC, @@ -351,6 +369,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); recurringDonation1.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation1.save(); @@ -368,7 +387,6 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { }); recurringDonation2.status = RECURRING_DONATION_STATUS.PENDING; await recurringDonation2.save(); - await recurringDonation1.save(); const recurringDonation3 = await createNewRecurringDonation({ txHash: generateRandomEvmTxHash(), @@ -380,6 +398,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 2, }); recurringDonation3.status = RECURRING_DONATION_STATUS.ENDED; await recurringDonation3.save(); @@ -399,7 +418,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { await recurringDonation4.save(); const count = await nonZeroRecurringDonationsByProjectId(project.id); - assert.equal(count, 1); + assert.equal(count, 2); }); } diff --git a/src/repositories/recurringDonationRepository.ts b/src/repositories/recurringDonationRepository.ts index 97bab373b..7dec0dea1 100644 --- a/src/repositories/recurringDonationRepository.ts +++ b/src/repositories/recurringDonationRepository.ts @@ -19,8 +19,9 @@ export const createNewRecurringDonation = async (params: { currency: string; anonymous: boolean; isBatch: boolean; + totalUsdStreamed?: number; }): Promise => { - const recurringDonation = await RecurringDonation.create({ + const recurringDonation = RecurringDonation.create({ project: params.project, donor: params.donor, anchorContractAddress: params.anchorContractAddress, @@ -30,6 +31,7 @@ export const createNewRecurringDonation = async (params: { flowRate: params.flowRate, anonymous: params.anonymous, isBatch: params.isBatch, + totalUsdStreamed: params.totalUsdStreamed, }); return recurringDonation.save(); }; From 96e93c89e7da3964c966772787db1a79d621627e Mon Sep 17 00:00:00 2001 From: Ramin Date: Sat, 27 Apr 2024 00:09:18 +0330 Subject: [PATCH 5/6] fix user recurring donation query --- src/entities/user.ts | 2 +- src/resolvers/donationResolver.test.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/entities/user.ts b/src/entities/user.ts index 311f18d28..ed26692b0 100644 --- a/src/entities/user.ts +++ b/src/entities/user.ts @@ -221,7 +221,7 @@ export class User extends BaseEntity { 'recurring_donation', ) .where(`recurring_donation."donorId" = :donorId`, { donorId: this.id }) - .andWhere('recurringDonation.totalUsdStreamed > 0') + .andWhere('recurring_donation.totalUsdStreamed > 0') .getCount(); // Sum of both counts diff --git a/src/resolvers/donationResolver.test.ts b/src/resolvers/donationResolver.test.ts index d827f4b7b..39eed727b 100644 --- a/src/resolvers/donationResolver.test.ts +++ b/src/resolvers/donationResolver.test.ts @@ -3425,6 +3425,7 @@ function donationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); recurringDonation.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation.save(); @@ -3439,6 +3440,7 @@ function donationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); recurringDonation2.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation2.save(); From 6dcbe2cb98d64aaf53c98763fa2a0dcfd7632541 Mon Sep 17 00:00:00 2001 From: Ramin Date: Sat, 27 Apr 2024 00:14:08 +0330 Subject: [PATCH 6/6] fix user recurring donation test --- src/resolvers/userResolver.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/resolvers/userResolver.test.ts b/src/resolvers/userResolver.test.ts index 1832bdabd..d996747f9 100644 --- a/src/resolvers/userResolver.test.ts +++ b/src/resolvers/userResolver.test.ts @@ -326,7 +326,6 @@ function userByAddressTestCases() { flowRate: '300', anonymous: false, currency: 'USDT', - totalUsdStreamed: 200, status: RECURRING_DONATION_STATUS.PENDING, }, }); @@ -350,7 +349,6 @@ function userByAddressTestCases() { flowRate: '300', anonymous: false, currency: 'USDT', - totalUsdStreamed: 200, status: RECURRING_DONATION_STATUS.FAILED, }, }); @@ -377,8 +375,8 @@ function userByAddressTestCases() { userData.walletAddress, ); // for totalDonated we consider all recurring donations but for donationsCount we consider only active recurring donations - assert.equal(result.data.data.userByAddress.totalDonated, 800); - assert.equal(result.data.data.userByAddress.donationsCount, 1); + assert.equal(result.data.data.userByAddress.totalDonated, 400); + assert.equal(result.data.data.userByAddress.donationsCount, 2); }); it('Get donationsCount and totalDonated correctly, when there is both recurringDonations and one time donation', async () => { const userData = {