diff --git a/src/entities/user.ts b/src/entities/user.ts index f3ea71cab..ed26692b0 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('recurring_donation.totalUsdStreamed > 0') .getCount(); // Sum of both counts diff --git a/src/repositories/recurringDonationRepository.test.ts b/src/repositories/recurringDonationRepository.test.ts index e8b49bc0d..60c29f122 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, @@ -256,6 +256,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { donor: creator, anchorContractAddress, flowRate: '100', + totalUsdStreamed: 1, currency, project, anonymous: false, @@ -263,7 +264,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 () => { @@ -298,6 +299,7 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); recurringDonation.status = RECURRING_DONATION_STATUS.ACTIVE; await recurringDonation.save(); @@ -312,11 +314,12 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { project, anonymous: false, isBatch: false, + totalUsdStreamed: 1, }); 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 () => { @@ -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(); @@ -398,8 +417,8 @@ function countOfActiveRecurringDonationsByProjectIdTestCases() { recurringDonation4.status = RECURRING_DONATION_STATUS.FAILED; await recurringDonation4.save(); - const count = await countOfActiveRecurringDonationsByProjectId(project.id); - assert.equal(count, 1); + const count = await nonZeroRecurringDonationsByProjectId(project.id); + assert.equal(count, 2); }); } diff --git a/src/repositories/recurringDonationRepository.ts b/src/repositories/recurringDonationRepository.ts index 0635dba4b..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(); }; @@ -129,14 +131,12 @@ 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.totalUsdStreamed > 0') .getCount(); }; 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(); 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) 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 = {