136 lines
4.0 KiB
TypeScript
136 lines
4.0 KiB
TypeScript
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;
|
|
challengesBackground?: string | null;
|
|
eventRegistrationPoints?: number;
|
|
eventFeedbackPoints?: number;
|
|
}
|
|
|
|
/**
|
|
* 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,
|
|
challengesBackground: null,
|
|
eventRegistrationPoints: 100,
|
|
eventFeedbackPoints: 100,
|
|
},
|
|
});
|
|
}
|
|
|
|
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),
|
|
challengesBackground:
|
|
data.challengesBackground === ""
|
|
? null
|
|
: (data.challengesBackground ?? undefined),
|
|
eventRegistrationPoints:
|
|
data.eventRegistrationPoints !== undefined
|
|
? data.eventRegistrationPoints
|
|
: undefined,
|
|
eventFeedbackPoints:
|
|
data.eventFeedbackPoints !== undefined
|
|
? data.eventFeedbackPoints
|
|
: 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),
|
|
challengesBackground:
|
|
data.challengesBackground === ""
|
|
? null
|
|
: (data.challengesBackground ?? null),
|
|
eventRegistrationPoints: data.eventRegistrationPoints ?? 100,
|
|
eventFeedbackPoints: data.eventFeedbackPoints ?? 100,
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Récupère l'image de fond pour une page donnée
|
|
*/
|
|
async getBackgroundImage(
|
|
page: "home" | "events" | "leaderboard" | "challenges",
|
|
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();
|