Files
got-gaming/services/preferences/site-preferences.service.ts

122 lines
3.5 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;
}
/**
* 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,
},
});
}
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),
},
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),
},
});
}
/**
* 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();