From 22864a3b55a71e07e9d0c9b224d4671c8287efda Mon Sep 17 00:00:00 2001 From: Jasmine Li Date: Mon, 29 Apr 2024 08:07:18 -0400 Subject: [PATCH] fixed bugs, still need to pass tests --- .../src/achievement/achievement.e2e-spec.ts | 1 + server/src/achievement/achievement.service.ts | 57 +++++++++++++++---- server/src/challenge/challenge.service.ts | 10 ++-- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/server/src/achievement/achievement.e2e-spec.ts b/server/src/achievement/achievement.e2e-spec.ts index 39122bb7..9addb976 100644 --- a/server/src/achievement/achievement.e2e-spec.ts +++ b/server/src/achievement/achievement.e2e-spec.ts @@ -72,6 +72,7 @@ describe('AchievementModule E2E', () => { console.log = function () {}; achievementService = module.get(AchievementService); + challengeService = module.get(ChallengeService); prisma = module.get(PrismaService); userService = module.get(UserService); eventService = module.get(EventService); diff --git a/server/src/achievement/achievement.service.ts b/server/src/achievement/achievement.service.ts index 60ba2868..713aa077 100644 --- a/server/src/achievement/achievement.service.ts +++ b/server/src/achievement/achievement.service.ts @@ -266,27 +266,40 @@ export class AchievementService { async checkAchievementProgress( user: User, challengeId: string, - isJourney: boolean, + isJourneyCompleted: boolean, ) { // find challenge corresponding to challengeId const curChallenge = await this.prisma.challenge.findUniqueOrThrow({ where: { id: challengeId }, + include: {linkedEvent: true} }); const ability = await this.abilityFactory.createForUser(user); + // find all achievements associated with the challenge that are accessible // by user and have incomplete trackers; joins tracker to resulting query const achs = await this.prisma.achievement.findMany({ where: { OR: [ - { linkedEventId: challengeId }, // achievements linked to the specific event of the challenge + // { linkedEventId: challengeId }, // achievements linked to the specific event of the challenge + { linkedEventId: curChallenge.linkedEventId }, // achievements linked to the specific event of the challenge { linkedEventId: null }, // achievements not linked to any specific event + { achievementType : AchievementType.}, + { locationType : LocationType.ANY }, ], AND: [ accessibleBy(ability, Action.Read).Achievement, - {locationType: curChallenge.location}, + // {locationType: curChallenge.location}, ], + trackers: { + every: { // + OR: [ + { userId: { not: user.id } }, // Trackers not belonging to the user + { dateComplete: { not: null } } // Trackers that are completed + ] + }, + }, }, include: { trackers: { @@ -319,22 +332,46 @@ export class AchievementService { const journeyOrChalAchShouldProgress = ach.achievementType === AchievementTypeDto.TOTAL_CHALLENGES_OR_JOURNEYS || - (isJourney && + (isJourneyCompleted && ach.achievementType === AchievementTypeDto.TOTAL_JOURNEYS) || - (!isJourney && + (!isJourneyCompleted && ach.achievementType === AchievementTypeDto.TOTAL_CHALLENGES); if (ach.achievementType === AchievementTypeDto.TOTAL_POINTS) { - tracker.progress += curChallenge.points; + const updatedTracker = await this.prisma.achievementTracker.update({ + where: { id: tracker.id }, + data: { + progress: { + increment: curChallenge.points // increment tracker progress by points of current challenge + } + }, + }); if (tracker.progress >= ach.requiredPoints) { // ach is newly completed; update tracker with completion date - tracker.dateComplete = new Date(); + await this.prisma.achievementTracker.update({ + where: { id: tracker.id }, + data: { + dateComplete: new Date() // add new date + } + }); } } else if (journeyOrChalAchShouldProgress) { - tracker.progress += 1; - if (tracker.progress >= ach.requiredPoints) { - tracker.dateComplete = new Date(); + const updatedTracker = await this.prisma.achievementTracker.update({ + where: { id: tracker.id }, + data: { + progress: { + increment: 1 // increment tracker progress by 1 + } + }, + }); + if (updatedTracker.progress >= ach.requiredPoints) { + await this.prisma.achievementTracker.update({ + where: { id: tracker.id }, + data: { + dateComplete: new Date() // add new date + } + }); } } diff --git a/server/src/challenge/challenge.service.ts b/server/src/challenge/challenge.service.ts index 4352d17d..c0261677 100644 --- a/server/src/challenge/challenge.service.ts +++ b/server/src/challenge/challenge.service.ts @@ -158,8 +158,8 @@ export class ChallengeService { user.id, ); - // check if the challenge is part of a journey - const isJourney = + // check if the completed challenge is completing a journey + const isJourneyCompleted = (await this.prisma.prevChallenge.count({ where: { userId: user.id, @@ -167,14 +167,14 @@ export class ChallengeService { trackerId: eventTracker.id, }, })) === - (await this.prisma.eventTracker.count({ - where: { id: eventTracker.id }, // CHECK + (await this.prisma.challenge.count({ + where: { linkedEventId: eventTracker.eventId }, })); await this.achievementService.checkAchievementProgress( user, challengeId, - isJourney, + isJourneyCompleted, ); await this.eventService.emitUpdateLeaderPosition({