more and more test fixes
All checks were successful
Deploy to Test Environment / deploy-to-test (push) Successful in 21m19s

This commit is contained in:
2026-01-04 11:28:47 -08:00
parent a9e56bc707
commit 057c4c9174
26 changed files with 544 additions and 210 deletions

View File

@@ -2,6 +2,7 @@
import { gamificationRepo } from './db/index.db';
import type { Logger } from 'pino';
import { ForeignKeyConstraintError } from './db/errors.db';
class GamificationService {
/**
@@ -11,9 +12,22 @@ class GamificationService {
* @param log The logger instance.
*/
async awardAchievement(userId: string, achievementName: string, log: Logger): Promise<void> {
// The repository layer handles database errors, including logging and throwing specific error types.
// This service method simply orchestrates the call.
return gamificationRepo.awardAchievement(userId, achievementName, log);
try {
await gamificationRepo.awardAchievement(userId, achievementName, log);
} catch (error) {
if (error instanceof ForeignKeyConstraintError) {
// This is an expected error (e.g., achievement name doesn't exist),
// which the repository layer should have already logged with appropriate context.
// We re-throw it so the calling layer (e.g., an admin route) can handle it.
throw error;
}
// For unexpected, generic errors, we log them at the service level before re-throwing.
log.error(
{ error, userId, achievementName },
'Error awarding achievement via admin endpoint:',
);
throw error;
}
}
/**
@@ -21,7 +35,12 @@ class GamificationService {
* @param log The logger instance.
*/
async getAllAchievements(log: Logger) {
return gamificationRepo.getAllAchievements(log);
try {
return await gamificationRepo.getAllAchievements(log);
} catch (error) {
log.error({ error }, 'Error in getAllAchievements service method');
throw error;
}
}
/**
@@ -30,7 +49,12 @@ class GamificationService {
* @param log The logger instance.
*/
async getLeaderboard(limit: number, log: Logger) {
return gamificationRepo.getLeaderboard(limit, log);
try {
return await gamificationRepo.getLeaderboard(limit, log);
} catch (error) {
log.error({ error, limit }, 'Error fetching leaderboard in service method.');
throw error;
}
}
/**
@@ -39,7 +63,12 @@ class GamificationService {
* @param log The logger instance.
*/
async getUserAchievements(userId: string, log: Logger) {
return gamificationRepo.getUserAchievements(userId, log);
try {
return await gamificationRepo.getUserAchievements(userId, log);
} catch (error) {
log.error({ error, userId }, 'Error fetching user achievements in service method.');
throw error;
}
}
}