Refactor event handling and user management: Replace direct database calls with service layer methods for events, user profiles, and preferences, enhancing code organization and maintainability. Update API routes to utilize new services for event registration, feedback, and user statistics, ensuring a consistent approach across the application.
This commit is contained in:
111
services/preferences/site-preferences.service.ts
Normal file
111
services/preferences/site-preferences.service.ts
Normal file
@@ -0,0 +1,111 @@
|
||||
import { prisma } from "../database";
|
||||
import { normalizeBackgroundUrl } from "@/lib/avatars";
|
||||
import type { SitePreferences } from "@/prisma/generated/prisma/client";
|
||||
|
||||
export interface UpdateSitePreferencesInput {
|
||||
homeBackground?: string | null;
|
||||
eventsBackground?: string | null;
|
||||
leaderboardBackground?: string | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Service de gestion des préférences globales du site
|
||||
*/
|
||||
export class SitePreferencesService {
|
||||
/**
|
||||
* Récupère les préférences du site
|
||||
*/
|
||||
async getSitePreferences(): Promise<SitePreferences | null> {
|
||||
return prisma.sitePreferences.findUnique({
|
||||
where: { id: "global" },
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère les préférences du site ou crée une entrée par défaut
|
||||
*/
|
||||
async getOrCreateSitePreferences(): Promise<SitePreferences> {
|
||||
let sitePreferences = await prisma.sitePreferences.findUnique({
|
||||
where: { id: "global" },
|
||||
});
|
||||
|
||||
if (!sitePreferences) {
|
||||
sitePreferences = await prisma.sitePreferences.create({
|
||||
data: {
|
||||
id: "global",
|
||||
homeBackground: null,
|
||||
eventsBackground: null,
|
||||
leaderboardBackground: null,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return sitePreferences;
|
||||
}
|
||||
|
||||
/**
|
||||
* Met à jour les préférences du site
|
||||
*/
|
||||
async updateSitePreferences(
|
||||
data: UpdateSitePreferencesInput
|
||||
): Promise<SitePreferences> {
|
||||
return prisma.sitePreferences.upsert({
|
||||
where: { id: "global" },
|
||||
update: {
|
||||
homeBackground:
|
||||
data.homeBackground === ""
|
||||
? null
|
||||
: (data.homeBackground ?? undefined),
|
||||
eventsBackground:
|
||||
data.eventsBackground === ""
|
||||
? null
|
||||
: (data.eventsBackground ?? undefined),
|
||||
leaderboardBackground:
|
||||
data.leaderboardBackground === ""
|
||||
? null
|
||||
: (data.leaderboardBackground ?? undefined),
|
||||
},
|
||||
create: {
|
||||
id: "global",
|
||||
homeBackground:
|
||||
data.homeBackground === "" ? null : (data.homeBackground ?? null),
|
||||
eventsBackground:
|
||||
data.eventsBackground === "" ? null : (data.eventsBackground ?? null),
|
||||
leaderboardBackground:
|
||||
data.leaderboardBackground === ""
|
||||
? null
|
||||
: (data.leaderboardBackground ?? null),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère l'image de fond pour une page donnée
|
||||
*/
|
||||
async getBackgroundImage(
|
||||
page: "home" | "events" | "leaderboard",
|
||||
defaultImage: string
|
||||
): Promise<string> {
|
||||
try {
|
||||
const sitePreferences = await prisma.sitePreferences.findUnique({
|
||||
where: { id: "global" },
|
||||
});
|
||||
|
||||
if (!sitePreferences) {
|
||||
return defaultImage;
|
||||
}
|
||||
|
||||
const imageKey = `${page}Background` as keyof typeof sitePreferences;
|
||||
const customImage = sitePreferences[imageKey];
|
||||
|
||||
const imageUrl = (customImage as string | null) || defaultImage;
|
||||
// Normaliser l'URL pour utiliser l'API si nécessaire
|
||||
return normalizeBackgroundUrl(imageUrl) || defaultImage;
|
||||
} catch (error) {
|
||||
console.error("Error fetching background image:", error);
|
||||
return defaultImage;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const sitePreferencesService = new SitePreferencesService();
|
||||
Reference in New Issue
Block a user