Add event registration and feedback points to site preferences: Update SitePreferences model and related components to include eventRegistrationPoints and eventFeedbackPoints, ensuring proper handling of user scores during event interactions.
This commit is contained in:
@@ -2,6 +2,7 @@ import { prisma } from "../database";
|
||||
import type { EventFeedback, Prisma } from "@/prisma/generated/prisma/client";
|
||||
import { ValidationError, NotFoundError } from "../errors";
|
||||
import { eventService } from "./event.service";
|
||||
import { sitePreferencesService } from "../preferences/site-preferences.service";
|
||||
|
||||
export interface CreateOrUpdateFeedbackInput {
|
||||
rating: number;
|
||||
@@ -168,11 +169,34 @@ export class EventFeedbackService {
|
||||
throw new NotFoundError("Événement");
|
||||
}
|
||||
|
||||
// Créer ou mettre à jour le feedback
|
||||
return this.createOrUpdateFeedback(userId, eventId, {
|
||||
rating: data.rating,
|
||||
comment: data.comment || null,
|
||||
});
|
||||
// Vérifier si c'est un nouveau feedback ou une mise à jour
|
||||
const existingFeedback = await this.getUserFeedback(userId, eventId);
|
||||
const isNewFeedback = !existingFeedback;
|
||||
|
||||
// Récupérer les points à attribuer depuis les préférences du site
|
||||
const sitePreferences = await sitePreferencesService.getOrCreateSitePreferences();
|
||||
const pointsToAward = sitePreferences.eventFeedbackPoints || 100;
|
||||
|
||||
// Créer ou mettre à jour le feedback et attribuer les points (seulement pour nouveau feedback)
|
||||
const [feedback] = await Promise.all([
|
||||
this.createOrUpdateFeedback(userId, eventId, {
|
||||
rating: data.rating,
|
||||
comment: data.comment || null,
|
||||
}),
|
||||
// Attribuer les points seulement si c'est un nouveau feedback
|
||||
isNewFeedback
|
||||
? prisma.user.update({
|
||||
where: { id: userId },
|
||||
data: {
|
||||
score: {
|
||||
increment: pointsToAward,
|
||||
},
|
||||
},
|
||||
})
|
||||
: Promise.resolve(null),
|
||||
]);
|
||||
|
||||
return feedback;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { EventRegistration } from "@/prisma/generated/prisma/client";
|
||||
import { ValidationError, NotFoundError, ConflictError } from "../errors";
|
||||
import { eventService } from "./event.service";
|
||||
import { calculateEventStatus } from "@/lib/eventStatus";
|
||||
import { sitePreferencesService } from "../preferences/site-preferences.service";
|
||||
|
||||
/**
|
||||
* Service de gestion des inscriptions aux événements
|
||||
@@ -24,18 +25,39 @@ export class EventRegistrationService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Désinscrit un utilisateur d'un événement
|
||||
* Désinscrit un utilisateur d'un événement et retire les points attribués
|
||||
*/
|
||||
async unregisterUserFromEvent(
|
||||
userId: string,
|
||||
eventId: string
|
||||
): Promise<void> {
|
||||
await prisma.eventRegistration.deleteMany({
|
||||
where: {
|
||||
userId,
|
||||
eventId,
|
||||
},
|
||||
});
|
||||
// Vérifier que l'utilisateur est bien inscrit avant de retirer les points
|
||||
const isRegistered = await this.checkUserRegistration(userId, eventId);
|
||||
if (!isRegistered) {
|
||||
return; // Pas d'inscription, rien à faire
|
||||
}
|
||||
|
||||
// Récupérer les points à retirer depuis les préférences du site
|
||||
const sitePreferences = await sitePreferencesService.getOrCreateSitePreferences();
|
||||
const pointsToRemove = sitePreferences.eventRegistrationPoints || 100;
|
||||
|
||||
// Supprimer l'inscription et retirer les points en parallèle
|
||||
await Promise.all([
|
||||
prisma.eventRegistration.deleteMany({
|
||||
where: {
|
||||
userId,
|
||||
eventId,
|
||||
},
|
||||
}),
|
||||
prisma.user.update({
|
||||
where: { id: userId },
|
||||
data: {
|
||||
score: {
|
||||
decrement: pointsToRemove,
|
||||
},
|
||||
},
|
||||
}),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -123,8 +145,24 @@ export class EventRegistrationService {
|
||||
throw new ConflictError("Vous êtes déjà inscrit à cet événement");
|
||||
}
|
||||
|
||||
// Créer l'inscription
|
||||
return this.registerUserToEvent(userId, eventId);
|
||||
// Récupérer les points à attribuer depuis les préférences du site
|
||||
const sitePreferences = await sitePreferencesService.getOrCreateSitePreferences();
|
||||
const pointsToAward = sitePreferences.eventRegistrationPoints || 100;
|
||||
|
||||
// Créer l'inscription et attribuer les points en parallèle
|
||||
const [registration] = await Promise.all([
|
||||
this.registerUserToEvent(userId, eventId),
|
||||
prisma.user.update({
|
||||
where: { id: userId },
|
||||
data: {
|
||||
score: {
|
||||
increment: pointsToAward,
|
||||
},
|
||||
},
|
||||
}),
|
||||
]);
|
||||
|
||||
return registration;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ export interface UpdateSitePreferencesInput {
|
||||
eventsBackground?: string | null;
|
||||
leaderboardBackground?: string | null;
|
||||
challengesBackground?: string | null;
|
||||
eventRegistrationPoints?: number;
|
||||
eventFeedbackPoints?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -38,6 +40,8 @@ export class SitePreferencesService {
|
||||
eventsBackground: null,
|
||||
leaderboardBackground: null,
|
||||
challengesBackground: null,
|
||||
eventRegistrationPoints: 100,
|
||||
eventFeedbackPoints: 100,
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -70,6 +74,14 @@ export class SitePreferencesService {
|
||||
data.challengesBackground === ""
|
||||
? null
|
||||
: (data.challengesBackground ?? undefined),
|
||||
eventRegistrationPoints:
|
||||
data.eventRegistrationPoints !== undefined
|
||||
? data.eventRegistrationPoints
|
||||
: undefined,
|
||||
eventFeedbackPoints:
|
||||
data.eventFeedbackPoints !== undefined
|
||||
? data.eventFeedbackPoints
|
||||
: undefined,
|
||||
},
|
||||
create: {
|
||||
id: "global",
|
||||
@@ -85,6 +97,8 @@ export class SitePreferencesService {
|
||||
data.challengesBackground === ""
|
||||
? null
|
||||
: (data.challengesBackground ?? null),
|
||||
eventRegistrationPoints: data.eventRegistrationPoints ?? 100,
|
||||
eventFeedbackPoints: data.eventFeedbackPoints ?? 100,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user