From b1686ef28a1f1d324a63cd29ae526f716353f39d Mon Sep 17 00:00:00 2001 From: Mohammad Ranjbar Z Date: Mon, 21 Nov 2022 10:03:18 +0300 Subject: [PATCH] Make boostings of a project zero when get cancelled related to https://github.com/Giveth/giveth-dapps-v2/issues/1837 --- package.json | 1 + src/repositories/powerBoostingRepository.ts | 21 +++++--- src/server/adminBro.ts | 4 ++ src/services/powerBoostingService.test.ts | 54 +++++++++++++++++++++ src/services/powerBoostingService.ts | 21 ++++++++ 5 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/services/powerBoostingService.test.ts create mode 100644 src/services/powerBoostingService.ts diff --git a/package.json b/package.json index cca00bc6f..0030499fa 100644 --- a/package.json +++ b/package.json @@ -161,6 +161,7 @@ "test:powerSnapshotService": "NODE_ENV=test mocha -t 30000 --exit -r ts-node/register ./test/pre-test-scripts.ts ./src/services/powerSnapshotServices.test.ts", "test:transactionsService": "NODE_ENV=test mocha -t 30000 --exit -r ts-node/register ./test/pre-test-scripts.ts ./src/services/transactionService.test.ts", "test:projectUpdatesService": "NODE_ENV=test mocha -t 30000 --exit -r ts-node/register ./test/pre-test-scripts.ts ./src/services/projectUpdatesService.test.ts", + "test:powerBoostingService": "NODE_ENV=test mocha -t 30000 --exit -r ts-node/register ./test/pre-test-scripts.ts ./src/services/powerBoostingService.test.ts", "test:blockByDateService": "NODE_ENV=test mocha -t 30000 --exit -r ts-node/register ./src/services/blockByDateService.test.ts", "test:categoryResolver": "NODE_ENV=test mocha -t 30000 --exit -r ts-node/register ./test/pre-test-scripts.ts ./src/resolvers/categoryResolver.test.ts", "test:givpower": "NODE_ENV=test mocha -b -t 30000 --exit -r ts-node/register ./test/pre-test-scripts.ts ./src/repositories/powerBoostingRepository.test.ts ./src/repositories/userPowerRepository.test.ts ./src/repositories/powerRoundRepository.test.ts ./src/repositories/userProjectPowerViewRepository.test.ts ./src/repositories/projectPowerViewRepository.test.ts ./src/resolvers/powerBoostingResolver.test.ts ./src/resolvers/userProjectPowerResolver.test.ts ./src/adapters/givpowerSubgraph/givPowerSubgraphAdapter.test.ts ./src/repositories/projectRepository.test.ts ./src/resolvers/projectResolver.test.ts ./src/repositories/dbCronRepository.test.ts", diff --git a/src/repositories/powerBoostingRepository.ts b/src/repositories/powerBoostingRepository.ts index 82832eb9e..fd379db74 100644 --- a/src/repositories/powerBoostingRepository.ts +++ b/src/repositories/powerBoostingRepository.ts @@ -64,8 +64,8 @@ export const findUsersWhoBoostedProject = async ( }; export const findPowerBoostings = async (params: { - take: number; - skip: number; + take?: number; + skip?: number; orderBy: { field: 'createdAt' | 'updatedAt' | 'percentage'; direction: 'ASC' | 'DESC'; @@ -86,11 +86,18 @@ export const findPowerBoostings = async (params: { if (params.projectId) { query.andWhere(`"projectId" =${params.projectId}`); } - return query - .orderBy(`powerBoosting.${params.orderBy.field}`, params.orderBy.direction) - .take(params.take) - .skip(params.skip) - .getManyAndCount(); + query.orderBy( + `powerBoosting.${params.orderBy.field}`, + params.orderBy.direction, + ); + + if (params.take) { + query.take(params.take); + } + if (params.skip) { + query.skip(params.skip); + } + return query.getManyAndCount(); }; export const findPowerBoostingsCountByUserId = async ( diff --git a/src/server/adminBro.ts b/src/server/adminBro.ts index 8dfdb6068..c3e00e7e8 100644 --- a/src/server/adminBro.ts +++ b/src/server/adminBro.ts @@ -91,6 +91,7 @@ import { refreshProjectFuturePowerView, refreshProjectPowerView, } from '../repositories/projectPowerViewRepository'; +import { changeUserBoostingsAfterProjectCancelled } from '../services/powerBoostingService'; // use redis for session data instead of in-memory storage // tslint:disable-next-line:no-var-requires @@ -2355,6 +2356,9 @@ export const updateStatusOfProjects = async ( await getNotificationAdapter().projectCancelled({ project: projectWithAdmin, }); + await changeUserBoostingsAfterProjectCancelled({ + projectId: project.id, + }); } else if (status === ProjStatus.active) { await getNotificationAdapter().projectReactivated({ project: projectWithAdmin, diff --git a/src/services/powerBoostingService.test.ts b/src/services/powerBoostingService.test.ts new file mode 100644 index 000000000..5aa4c0a01 --- /dev/null +++ b/src/services/powerBoostingService.test.ts @@ -0,0 +1,54 @@ +import { + createProjectData, + generateRandomEtheriumAddress, + saveProjectDirectlyToDb, + saveUserDirectlyToDb, + sleep, +} from '../../test/testUtils'; +import { + findUserPowerBoosting, + setMultipleBoosting, +} from '../repositories/powerBoostingRepository'; +import { assert } from 'chai'; +import { changeUserBoostingsAfterProjectCancelled } from './powerBoostingService'; + +describe( + 'changeUserBoostingsAfterProjectCancelled', + changeUserBoostingsAfterProjectCancelledTestCases, +); + +function changeUserBoostingsAfterProjectCancelledTestCases() { + it('should change user percentage to zero when project cancelled', async () => { + const user1 = await saveUserDirectlyToDb(generateRandomEtheriumAddress()); + const user2 = await saveUserDirectlyToDb(generateRandomEtheriumAddress()); + const firstProject = await saveProjectDirectlyToDb(createProjectData()); + const projectThatWouldGetCancelled = await saveProjectDirectlyToDb( + createProjectData(), + ); + await setMultipleBoosting({ + userId: user1.id, + projectIds: [firstProject.id, projectThatWouldGetCancelled.id], + percentages: [80, 20], + }); + await setMultipleBoosting({ + userId: user2.id, + projectIds: [firstProject.id, projectThatWouldGetCancelled.id], + percentages: [70, 30], + }); + await changeUserBoostingsAfterProjectCancelled({ + projectId: projectThatWouldGetCancelled.id, + }); + + // Changing percentages is async we sleep some milli seconds to make sure all updates has been done + await sleep(100); + const firstUserBoostings = await findUserPowerBoosting(user1.id); + const secondUserBoostings = await findUserPowerBoosting(user2.id); + + assert.equal(firstUserBoostings.length, 1); + assert.equal(secondUserBoostings.length, 1); + assert.equal(firstUserBoostings[0].percentage, 100); + assert.equal(firstUserBoostings[0].projectId, firstProject.id); + assert.equal(secondUserBoostings[0].percentage, 100); + assert.equal(secondUserBoostings[0].projectId, firstProject.id); + }); +} diff --git a/src/services/powerBoostingService.ts b/src/services/powerBoostingService.ts new file mode 100644 index 000000000..a96a6e089 --- /dev/null +++ b/src/services/powerBoostingService.ts @@ -0,0 +1,21 @@ +import { + findPowerBoostings, + setSingleBoosting, +} from '../repositories/powerBoostingRepository'; + +export const changeUserBoostingsAfterProjectCancelled = async (params: { + projectId: number; +}) => { + const { projectId } = params; + const [powerBoostings] = await findPowerBoostings({ + orderBy: { direction: 'DESC', field: 'createdAt' }, + projectId, + }); + powerBoostings.forEach(powerBoosting => + setSingleBoosting({ + userId: powerBoosting.userId, + projectId, + percentage: 0, + }), + ); +};