Skip to content

Commit

Permalink
Achivement trackers are made for all
Browse files Browse the repository at this point in the history
  • Loading branch information
neketka committed Apr 30, 2024
1 parent dbd0f40 commit a2c8538
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 15 deletions.
61 changes: 46 additions & 15 deletions server/src/achievement/achievement.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ export class AchievementService {
} else {
return null;
}
if (ach) this.createAchievementTrackers(undefined, ach);
return ach;
}

Expand Down Expand Up @@ -358,20 +359,7 @@ export class AchievementService {
});

for (const ach of uncompletedAchs) {
let achTracker: AchievementTracker;
if (ach.trackers.length === 0) {
// create tracker since it doesn't exist
achTracker = await this.prisma.achievementTracker.create({
data: {
userId: user.id,
achievementId: ach.id,
progress: 0,
dateComplete: null,
},
});
} else {
achTracker = ach.trackers[0];
}
let achTracker = ach.trackers[0];

// In case the above completion check fails
if (achTracker.progress < ach.requiredPoints) {
Expand All @@ -391,7 +379,7 @@ export class AchievementService {
},
});

if (achTracker.progress >= ach.requiredPoints) {
if (achTracker.progress > ach.requiredPoints) {
achTracker = await this.prisma.achievementTracker.update({
where: { id: achTracker.id },
data: {
Expand All @@ -405,4 +393,47 @@ export class AchievementService {
}
}
}

async createAchievementTrackers(user?: User, achievement?: Achievement) {
if (user) {
const ability = this.abilityFactory.createForUser(user);

const achsWithoutTrackers = await this.prisma.achievement.findMany({
where: {
id: achievement?.id,
AND: [accessibleBy(ability).Achievement],
trackers: { none: { userId: user.id } },
},
});

await this.prisma.achievementTracker.createMany({
data: achsWithoutTrackers.map(ach => ({
userId: user.id,
progress: 0,
achievementId: ach.id,
})),
});
} else if (achievement) {
const usersWithoutTrackers = await this.prisma.user.findMany({
where: {
memberOf: {
some: { achievements: { some: { id: achievement.id } } },
},
achievementTrackers: {
none: { achievementId: achievement.id },
},
},
});

await this.prisma.achievementTracker.createMany({
data: usersWithoutTrackers.map(usr => ({
userId: usr.id,
progress: 0,
achievementId: achievement.id,
})),
});
} else {
throw 'Cannot create all possible achievement trackers in one call!';
}
}
}
2 changes: 2 additions & 0 deletions server/src/user/user.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { PrismaModule } from '../prisma/prisma.module';
import { UserGateway } from './user.gateway';
import { UserService } from './user.service';
import { CaslModule } from '../casl/casl.module';
import { AchievementModule } from '../achievement/achievement.module';

@Module({
imports: [
Expand All @@ -19,6 +20,7 @@ import { CaslModule } from '../casl/casl.module';
PrismaModule,
EventModule,
OrganizationModule,
AchievementModule,
CaslModule,
],
providers: [UserService, UserGateway],
Expand Down
4 changes: 4 additions & 0 deletions server/src/user/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { Action } from '../casl/action.enum';
import { subject } from '@casl/ability';
import { accessibleBy } from '@casl/prisma';
import { join } from 'path';
import { AchievementService } from '../achievement/achievement.service';

@Injectable()
export class UserService {
Expand All @@ -34,6 +35,7 @@ export class UserService {
private orgService: OrganizationService,
private clientService: ClientService,
private abilityFactory: CaslAbilityFactory,
private achievementService: AchievementService,
) {}

/** Find a user by their authentication token */
Expand Down Expand Up @@ -112,6 +114,8 @@ export class UserService {
await this.orgService.joinOrganization(user, cornellOrg.accessCode);
}

await this.achievementService.createAchievementTrackers(user);

return user;
}

Expand Down

0 comments on commit a2c8538

Please sign in to comment.