Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

F 1837 handle cancel projects in power boosting #731

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
21 changes: 14 additions & 7 deletions src/repositories/powerBoostingRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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 (
Expand Down
15 changes: 14 additions & 1 deletion src/server/adminBro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ import {
refreshProjectFuturePowerView,
refreshProjectPowerView,
} from '../repositories/projectPowerViewRepository';
import { STATUS_CODES } from 'http';
import { changeUserBoostingsAfterProjectCancelled } from '../services/powerBoostingService';

// use redis for session data instead of in-memory storage
// tslint:disable-next-line:no-var-requires
Expand Down Expand Up @@ -1489,6 +1489,16 @@ const getAdminBroInstance = async () => {
eventHandler.handler({ project });
}
});

if (
statusChanges?.includes(
NOTIFICATIONS_EVENT_NAMES.PROJECT_CANCELLED,
)
) {
await changeUserBoostingsAfterProjectCancelled({
projectId: project.id,
});
}
}

return request;
Expand Down Expand Up @@ -2454,6 +2464,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,
Expand Down
54 changes: 54 additions & 0 deletions src/services/powerBoostingService.test.ts
Original file line number Diff line number Diff line change
@@ -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);
});
}
21 changes: 21 additions & 0 deletions src/services/powerBoostingService.ts
Original file line number Diff line number Diff line change
@@ -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,
}),
);
};