Skip to content

Commit 9be1052

Browse files
LiboukAlexandre-Monney
authored andcommitted
feat(api): prevent reward if user already has one
1 parent de4c2c1 commit 9be1052

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

api/src/quest/domain/usecases/reward-user.js

+7
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,20 @@ export const rewardUser = async ({
1313

1414
const eligibilities = await eligibilityRepository.find({ userId });
1515

16+
const rewards = await rewardRepository.getByUserId({ userId });
17+
const rewardIds = rewards.map((reward) => reward.rewardId);
18+
1619
for (const quest of quests) {
1720
const isEligibleForQuest = eligibilities.some((eligibility) => quest.isEligible(eligibility));
1821

1922
if (!isEligibleForQuest) {
2023
continue;
2124
}
2225

26+
if (rewardIds.includes(quest.rewardId)) {
27+
continue;
28+
}
29+
2330
const success = await successRepository.find({ userId, skillIds: quest.successRequirements[0].data.ids });
2431
const userHasSucceedQuest = quest.isSuccessful(success);
2532

Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
export const reward = async ({ userId, rewardId, profileRewardApi }) => {
22
return profileRewardApi.save(userId, rewardId);
33
};
4+
5+
export const getByUserId = async ({ userId, profileRewardApi }) => {
6+
return profileRewardApi.getByUserId(userId);
7+
};

api/tests/quest/unit/domain/usecases/reward-user_test.js

+25
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,29 @@ describe('Quest | Unit | Domain | Usecases | RewardUser', function () {
8282
expect(rewardRepository.save).to.have.not.been.called;
8383
});
8484
});
85+
86+
context('when the user is eligible but already got the reward', function () {
87+
it('should not call success repository', async function () {
88+
// given
89+
const questRewardId = Symbol('questRewardId');
90+
const quest = { isEligible: () => true, rewardId: questRewardId };
91+
questRepository.findAll.resolves([quest]);
92+
eligibilityRepository.find.resolves([Symbol('eligibility')]);
93+
rewardRepository.getByUserId.resolves([
94+
{
95+
rewardId: questRewardId,
96+
},
97+
]);
98+
99+
// when
100+
await rewardUser({
101+
userId,
102+
questRepository,
103+
eligibilityRepository,
104+
successRepository,
105+
rewardRepository,
106+
});
107+
expect(successRepository.find).to.not.have.been.called;
108+
});
109+
});
85110
});

0 commit comments

Comments
 (0)