From 9bcafe54d31abdf57476961552816b1de5e01b7c Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Mon, 22 Dec 2025 08:54:51 +0100 Subject: [PATCH] Add profile and house background preferences to SitePreferences: Extend SitePreferences model and related services to include profileBackground and houseBackground fields. Update API and UI components to support new background settings, enhancing user customization options. --- actions/admin/preferences.ts | 6 + actions/challenges/create.ts | 1 + app/api/challenges/route.ts | 1 + app/api/preferences/route.ts | 6 + app/api/users/route.ts | 1 + app/houses/page.tsx | 2 +- app/profile/page.tsx | 2 +- components/admin/BackgroundPreferences.tsx | 168 ++++++++++++++++++ hooks/usePreferences.ts | 12 +- lib/preferences.ts | 2 +- prisma/generated/prisma/internal/class.ts | 4 +- .../prisma/internal/prismaNamespace.ts | 2 + .../prisma/internal/prismaNamespaceBrowser.ts | 2 + .../prisma/models/SitePreferences.ts | 58 +++++- .../migration.sql | 3 + .../migration.sql | 3 + prisma/schema.prisma | 2 + .../preferences/site-preferences.service.ts | 30 +++- 18 files changed, 295 insertions(+), 10 deletions(-) create mode 100644 prisma/migrations/20250116000000_add_profile_background/migration.sql create mode 100644 prisma/migrations/20250116000001_add_house_background/migration.sql diff --git a/actions/admin/preferences.ts b/actions/admin/preferences.ts index 8bd71bf..6f287c2 100644 --- a/actions/admin/preferences.ts +++ b/actions/admin/preferences.ts @@ -20,6 +20,8 @@ export async function updateSitePreferences(data: { eventsBackground?: string | null; leaderboardBackground?: string | null; challengesBackground?: string | null; + profileBackground?: string | null; + houseBackground?: string | null; eventRegistrationPoints?: number; eventFeedbackPoints?: number; houseJoinPoints?: number; @@ -34,6 +36,8 @@ export async function updateSitePreferences(data: { eventsBackground: data.eventsBackground, leaderboardBackground: data.leaderboardBackground, challengesBackground: data.challengesBackground, + profileBackground: data.profileBackground, + houseBackground: data.houseBackground, eventRegistrationPoints: data.eventRegistrationPoints, eventFeedbackPoints: data.eventFeedbackPoints, houseJoinPoints: data.houseJoinPoints, @@ -46,6 +50,8 @@ export async function updateSitePreferences(data: { revalidatePath("/events"); revalidatePath("/leaderboard"); revalidatePath("/challenges"); + revalidatePath("/profile"); + revalidatePath("/houses"); return { success: true, data: preferences }; } catch (error) { diff --git a/actions/challenges/create.ts b/actions/challenges/create.ts index e2dcf69..7ed497f 100644 --- a/actions/challenges/create.ts +++ b/actions/challenges/create.ts @@ -128,3 +128,4 @@ export async function cancelChallenge(challengeId: string) { } } + diff --git a/app/api/challenges/route.ts b/app/api/challenges/route.ts index 11c31fb..3de5555 100644 --- a/app/api/challenges/route.ts +++ b/app/api/challenges/route.ts @@ -28,3 +28,4 @@ export async function GET() { } } + diff --git a/app/api/preferences/route.ts b/app/api/preferences/route.ts index 323f0cd..5a1a2cf 100644 --- a/app/api/preferences/route.ts +++ b/app/api/preferences/route.ts @@ -13,6 +13,8 @@ export async function GET() { eventsBackground: null, leaderboardBackground: null, challengesBackground: null, + profileBackground: null, + houseBackground: null, }); } @@ -21,6 +23,8 @@ export async function GET() { eventsBackground: sitePreferences.eventsBackground, leaderboardBackground: sitePreferences.leaderboardBackground, challengesBackground: sitePreferences.challengesBackground, + profileBackground: sitePreferences.profileBackground, + houseBackground: sitePreferences.houseBackground, }); } catch (error) { console.error("Error fetching preferences:", error); @@ -30,6 +34,8 @@ export async function GET() { eventsBackground: null, leaderboardBackground: null, challengesBackground: null, + profileBackground: null, + houseBackground: null, }, { status: 200 } ); diff --git a/app/api/users/route.ts b/app/api/users/route.ts index f648224..d451344 100644 --- a/app/api/users/route.ts +++ b/app/api/users/route.ts @@ -40,3 +40,4 @@ export async function GET() { } } + diff --git a/app/houses/page.tsx b/app/houses/page.tsx index 74ab996..f4227b7 100644 --- a/app/houses/page.tsx +++ b/app/houses/page.tsx @@ -125,7 +125,7 @@ export default async function HousesPage() { username: "asc", }, }), - getBackgroundImage("challenges", "/got-2.jpg"), + getBackgroundImage("houses", "/got-2.jpg"), ]); // Sérialiser les données pour le client diff --git a/app/profile/page.tsx b/app/profile/page.tsx index 8d3e88c..95c10f2 100644 --- a/app/profile/page.tsx +++ b/app/profile/page.tsx @@ -29,7 +29,7 @@ export default async function ProfilePage() { score: true, createdAt: true, }), - getBackgroundImage("home", "/got-background.jpg"), + getBackgroundImage("profile", "/got-background.jpg"), ]); if (!user) { diff --git a/components/admin/BackgroundPreferences.tsx b/components/admin/BackgroundPreferences.tsx index bb56c11..54ed2f8 100644 --- a/components/admin/BackgroundPreferences.tsx +++ b/components/admin/BackgroundPreferences.tsx @@ -11,6 +11,8 @@ interface SitePreferences { eventsBackground: string | null; leaderboardBackground: string | null; challengesBackground: string | null; + profileBackground: string | null; + houseBackground: string | null; eventRegistrationPoints?: number; } @@ -23,6 +25,8 @@ const DEFAULT_IMAGES = { events: "/got-2.jpg", leaderboard: "/leaderboard-bg.jpg", challenges: "/got-2.jpg", + profile: "/got-background.jpg", + houses: "/got-2.jpg", }; export default function BackgroundPreferences({ @@ -64,6 +68,14 @@ export default function BackgroundPreferences({ initialPreferences.challengesBackground, DEFAULT_IMAGES.challenges ), + profileBackground: getFormValue( + initialPreferences.profileBackground, + DEFAULT_IMAGES.profile + ), + houseBackground: getFormValue( + initialPreferences.houseBackground, + DEFAULT_IMAGES.houses + ), }), [initialPreferences] ); @@ -101,6 +113,14 @@ export default function BackgroundPreferences({ formData.challengesBackground, DEFAULT_IMAGES.challenges ), + profileBackground: getApiValue( + formData.profileBackground, + DEFAULT_IMAGES.profile + ), + houseBackground: getApiValue( + formData.houseBackground, + DEFAULT_IMAGES.houses + ), }; const result = await updateSitePreferences(apiData); @@ -125,6 +145,14 @@ export default function BackgroundPreferences({ result.data.challengesBackground, DEFAULT_IMAGES.challenges ), + profileBackground: getFormValue( + result.data.profileBackground, + DEFAULT_IMAGES.profile + ), + houseBackground: getFormValue( + result.data.houseBackground, + DEFAULT_IMAGES.houses + ), }); setIsEditing(false); } else { @@ -157,6 +185,14 @@ export default function BackgroundPreferences({ preferences.challengesBackground, DEFAULT_IMAGES.challenges ), + profileBackground: getFormValue( + preferences.profileBackground, + DEFAULT_IMAGES.profile + ), + houseBackground: getFormValue( + preferences.houseBackground, + DEFAULT_IMAGES.houses + ), }); } }; @@ -226,6 +262,26 @@ export default function BackgroundPreferences({ } label="Background Challenges" /> + + setFormData({ + ...formData, + profileBackground: url, + }) + } + label="Background Profile" + /> + + setFormData({ + ...formData, + houseBackground: url, + }) + } + label="Background Houses" + />
+
+ + Profile: + + {(() => { + const currentImage = + preferences?.profileBackground && + preferences.profileBackground.trim() !== "" + ? preferences.profileBackground + : DEFAULT_IMAGES.profile; + const isDefault = + !preferences?.profileBackground || + preferences.profileBackground.trim() === ""; + + return ( +
+
+ Profile background { + const target = e.currentTarget; + const currentSrc = target.src; + const fallbackSrc = "/got-background.jpg"; + if (!currentSrc.includes(fallbackSrc)) { + target.src = fallbackSrc; + } else { + target.style.display = "none"; + const fallbackDiv = + target.nextElementSibling as HTMLElement; + if (fallbackDiv) { + fallbackDiv.classList.remove("hidden"); + } + } + }} + /> +
+ No image +
+
+
+ + {isDefault ? "Par défaut: " : ""} + {currentImage} + + {isDefault && ( + + (Image par défaut) + + )} +
+
+ ); + })()} +
+
+ + Houses: + + {(() => { + const currentImage = + preferences?.houseBackground && + preferences.houseBackground.trim() !== "" + ? preferences.houseBackground + : DEFAULT_IMAGES.houses; + const isDefault = + !preferences?.houseBackground || + preferences.houseBackground.trim() === ""; + + return ( +
+
+ Houses background { + const target = e.currentTarget; + const currentSrc = target.src; + const fallbackSrc = "/got-2.jpg"; + if (!currentSrc.includes(fallbackSrc)) { + target.src = fallbackSrc; + } else { + target.style.display = "none"; + const fallbackDiv = + target.nextElementSibling as HTMLElement; + if (fallbackDiv) { + fallbackDiv.classList.remove("hidden"); + } + } + }} + /> +
+ No image +
+
+
+ + {isDefault ? "Par défaut: " : ""} + {currentImage} + + {isDefault && ( + + (Image par défaut) + + )} +
+
+ ); + })()} +
)} diff --git a/hooks/usePreferences.ts b/hooks/usePreferences.ts index 76c8444..aff747b 100644 --- a/hooks/usePreferences.ts +++ b/hooks/usePreferences.ts @@ -6,6 +6,8 @@ interface Preferences { eventsBackground: string | null; leaderboardBackground: string | null; challengesBackground: string | null; + profileBackground: string | null; + houseBackground: string | null; } export function usePreferences() { @@ -23,6 +25,8 @@ export function usePreferences() { eventsBackground: null, leaderboardBackground: null, challengesBackground: null, + profileBackground: null, + houseBackground: null, } ); setLoading(false); @@ -33,6 +37,8 @@ export function usePreferences() { eventsBackground: null, leaderboardBackground: null, challengesBackground: null, + profileBackground: null, + houseBackground: null, }); setLoading(false); }); @@ -42,7 +48,7 @@ export function usePreferences() { } export function useBackgroundImage( - page: "home" | "events" | "leaderboard" | "challenges", + page: "home" | "events" | "leaderboard" | "challenges" | "profile" | "houses", defaultImage: string ) { const { preferences } = usePreferences(); @@ -51,7 +57,9 @@ export function useBackgroundImage( useEffect(() => { if (preferences) { - const imageKey = `${page}Background` as keyof Preferences; + // Mapping spécial pour "houses" -> "house" (car la colonne est houseBackground) + const dbPage = page === "houses" ? "house" : page; + const imageKey = `${dbPage}Background` as keyof Preferences; const customImage = preferences[imageKey]; const rawImage = customImage || defaultImage; // Normaliser l'URL pour utiliser l'API si nécessaire diff --git a/lib/preferences.ts b/lib/preferences.ts index 2462742..17f8ee6 100644 --- a/lib/preferences.ts +++ b/lib/preferences.ts @@ -1,7 +1,7 @@ import { sitePreferencesService } from "@/services/preferences/site-preferences.service"; export async function getBackgroundImage( - page: "home" | "events" | "leaderboard" | "challenges", + page: "home" | "events" | "leaderboard" | "challenges" | "profile" | "houses", defaultImage: string ): Promise { return sitePreferencesService.getBackgroundImage(page, defaultImage); diff --git a/prisma/generated/prisma/internal/class.ts b/prisma/generated/prisma/internal/class.ts index d663e7a..84aabca 100644 --- a/prisma/generated/prisma/internal/class.ts +++ b/prisma/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.1.0", "engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n bio String?\n characterClass CharacterClass?\n eventFeedbacks EventFeedback[]\n eventRegistrations EventRegistration[]\n preferences UserPreferences?\n challengesAsChallenger Challenge[] @relation(\"Challenger\")\n challengesAsChallenged Challenge[] @relation(\"Challenged\")\n challengesAsAdmin Challenge[] @relation(\"AdminValidator\")\n challengesAsWinner Challenge[] @relation(\"ChallengeWinner\")\n houseMemberships HouseMembership[]\n houseInvitationsSent HouseInvitation[] @relation(\"Inviter\")\n houseInvitationsReceived HouseInvitation[] @relation(\"Invitee\")\n houseRequestsSent HouseRequest[] @relation(\"Requester\")\n housesCreated House[] @relation(\"HouseCreator\")\n\n @@index([score])\n @@index([email])\n}\n\nmodel UserPreferences {\n id String @id @default(cuid())\n userId String @unique\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n theme String? @default(\"default\")\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel Event {\n id String @id @default(cuid())\n date DateTime\n name String\n description String\n type EventType\n room String?\n time String?\n maxPlaces Int?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n feedbacks EventFeedback[]\n registrations EventRegistration[]\n\n @@index([date])\n}\n\nmodel EventRegistration {\n id String @id @default(cuid())\n userId String\n eventId String\n createdAt DateTime @default(now())\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n}\n\nmodel EventFeedback {\n id String @id @default(cuid())\n userId String\n eventId String\n rating Int\n comment String?\n isRead Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n @@index([isRead])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n challengesBackground String?\n eventRegistrationPoints Int @default(100)\n eventFeedbackPoints Int @default(100)\n houseJoinPoints Int @default(100)\n houseLeavePoints Int @default(100)\n houseCreatePoints Int @default(100)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n ATELIER\n KATA\n PRESENTATION\n LEARNING_HOUR\n}\n\nenum CharacterClass {\n WARRIOR\n MAGE\n ROGUE\n RANGER\n PALADIN\n ENGINEER\n MERCHANT\n SCHOLAR\n BERSERKER\n NECROMANCER\n}\n\nenum ChallengeStatus {\n PENDING\n ACCEPTED\n COMPLETED\n REJECTED\n CANCELLED\n}\n\nmodel Challenge {\n id String @id @default(cuid())\n challengerId String // Joueur qui lance le défi\n challengedId String // Joueur qui reçoit le défi\n challenger User @relation(\"Challenger\", fields: [challengerId], references: [id], onDelete: Cascade)\n challenged User @relation(\"Challenged\", fields: [challengedId], references: [id], onDelete: Cascade)\n title String // Titre du défi\n description String // Description détaillée du défi\n pointsReward Int @default(100) // Points à gagner pour le gagnant\n status ChallengeStatus @default(PENDING)\n adminId String? // Admin qui valide le défi\n admin User? @relation(\"AdminValidator\", fields: [adminId], references: [id], onDelete: SetNull)\n adminComment String? // Commentaire de l'admin lors de la validation/rejet\n winnerId String? // ID du gagnant (challengerId ou challengedId)\n winner User? @relation(\"ChallengeWinner\", fields: [winnerId], references: [id], onDelete: SetNull)\n createdAt DateTime @default(now())\n acceptedAt DateTime? // Date d'acceptation du défi\n completedAt DateTime? // Date de validation par l'admin\n updatedAt DateTime @updatedAt\n\n @@index([challengerId])\n @@index([challengedId])\n @@index([status])\n @@index([adminId])\n}\n\nmodel House {\n id String @id @default(cuid())\n name String\n description String?\n creatorId String\n creator User @relation(\"HouseCreator\", fields: [creatorId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n memberships HouseMembership[]\n invitations HouseInvitation[]\n requests HouseRequest[]\n\n @@index([creatorId])\n @@index([name])\n}\n\nmodel HouseMembership {\n id String @id @default(cuid())\n houseId String\n userId String\n role HouseRole @default(MEMBER)\n joinedAt DateTime @default(now())\n house House @relation(fields: [houseId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([houseId, userId])\n @@index([houseId])\n @@index([userId])\n}\n\nmodel HouseInvitation {\n id String @id @default(cuid())\n houseId String\n inviterId String // Utilisateur qui envoie l'invitation\n inviteeId String // Utilisateur invité\n status InvitationStatus @default(PENDING)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n house House @relation(fields: [houseId], references: [id], onDelete: Cascade)\n inviter User @relation(\"Inviter\", fields: [inviterId], references: [id], onDelete: Cascade)\n invitee User @relation(\"Invitee\", fields: [inviteeId], references: [id], onDelete: Cascade)\n\n @@unique([houseId, inviteeId])\n @@index([houseId])\n @@index([inviteeId])\n @@index([status])\n}\n\nmodel HouseRequest {\n id String @id @default(cuid())\n houseId String\n requesterId String // Utilisateur qui demande à rejoindre\n status RequestStatus @default(PENDING)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n house House @relation(fields: [houseId], references: [id], onDelete: Cascade)\n requester User @relation(\"Requester\", fields: [requesterId], references: [id], onDelete: Cascade)\n\n @@unique([houseId, requesterId])\n @@index([houseId])\n @@index([requesterId])\n @@index([status])\n}\n\nenum HouseRole {\n OWNER\n ADMIN\n MEMBER\n}\n\nenum InvitationStatus {\n PENDING\n ACCEPTED\n REJECTED\n CANCELLED\n}\n\nenum RequestStatus {\n PENDING\n ACCEPTED\n REJECTED\n CANCELLED\n}\n", + "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"./generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n password String\n username String @unique\n role Role @default(USER)\n score Int @default(0)\n level Int @default(1)\n hp Int @default(1000)\n maxHp Int @default(1000)\n xp Int @default(0)\n maxXp Int @default(5000)\n avatar String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n bio String?\n characterClass CharacterClass?\n eventFeedbacks EventFeedback[]\n eventRegistrations EventRegistration[]\n preferences UserPreferences?\n challengesAsChallenger Challenge[] @relation(\"Challenger\")\n challengesAsChallenged Challenge[] @relation(\"Challenged\")\n challengesAsAdmin Challenge[] @relation(\"AdminValidator\")\n challengesAsWinner Challenge[] @relation(\"ChallengeWinner\")\n houseMemberships HouseMembership[]\n houseInvitationsSent HouseInvitation[] @relation(\"Inviter\")\n houseInvitationsReceived HouseInvitation[] @relation(\"Invitee\")\n houseRequestsSent HouseRequest[] @relation(\"Requester\")\n housesCreated House[] @relation(\"HouseCreator\")\n\n @@index([score])\n @@index([email])\n}\n\nmodel UserPreferences {\n id String @id @default(cuid())\n userId String @unique\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n theme String? @default(\"default\")\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel Event {\n id String @id @default(cuid())\n date DateTime\n name String\n description String\n type EventType\n room String?\n time String?\n maxPlaces Int?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n feedbacks EventFeedback[]\n registrations EventRegistration[]\n\n @@index([date])\n}\n\nmodel EventRegistration {\n id String @id @default(cuid())\n userId String\n eventId String\n createdAt DateTime @default(now())\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n}\n\nmodel EventFeedback {\n id String @id @default(cuid())\n userId String\n eventId String\n rating Int\n comment String?\n isRead Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, eventId])\n @@index([userId])\n @@index([eventId])\n @@index([isRead])\n}\n\nmodel SitePreferences {\n id String @id @default(\"global\")\n homeBackground String?\n eventsBackground String?\n leaderboardBackground String?\n challengesBackground String?\n profileBackground String?\n houseBackground String?\n eventRegistrationPoints Int @default(100)\n eventFeedbackPoints Int @default(100)\n houseJoinPoints Int @default(100)\n houseLeavePoints Int @default(100)\n houseCreatePoints Int @default(100)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum Role {\n USER\n ADMIN\n}\n\nenum EventType {\n ATELIER\n KATA\n PRESENTATION\n LEARNING_HOUR\n}\n\nenum CharacterClass {\n WARRIOR\n MAGE\n ROGUE\n RANGER\n PALADIN\n ENGINEER\n MERCHANT\n SCHOLAR\n BERSERKER\n NECROMANCER\n}\n\nenum ChallengeStatus {\n PENDING\n ACCEPTED\n COMPLETED\n REJECTED\n CANCELLED\n}\n\nmodel Challenge {\n id String @id @default(cuid())\n challengerId String // Joueur qui lance le défi\n challengedId String // Joueur qui reçoit le défi\n challenger User @relation(\"Challenger\", fields: [challengerId], references: [id], onDelete: Cascade)\n challenged User @relation(\"Challenged\", fields: [challengedId], references: [id], onDelete: Cascade)\n title String // Titre du défi\n description String // Description détaillée du défi\n pointsReward Int @default(100) // Points à gagner pour le gagnant\n status ChallengeStatus @default(PENDING)\n adminId String? // Admin qui valide le défi\n admin User? @relation(\"AdminValidator\", fields: [adminId], references: [id], onDelete: SetNull)\n adminComment String? // Commentaire de l'admin lors de la validation/rejet\n winnerId String? // ID du gagnant (challengerId ou challengedId)\n winner User? @relation(\"ChallengeWinner\", fields: [winnerId], references: [id], onDelete: SetNull)\n createdAt DateTime @default(now())\n acceptedAt DateTime? // Date d'acceptation du défi\n completedAt DateTime? // Date de validation par l'admin\n updatedAt DateTime @updatedAt\n\n @@index([challengerId])\n @@index([challengedId])\n @@index([status])\n @@index([adminId])\n}\n\nmodel House {\n id String @id @default(cuid())\n name String\n description String?\n creatorId String\n creator User @relation(\"HouseCreator\", fields: [creatorId], references: [id], onDelete: Cascade)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n memberships HouseMembership[]\n invitations HouseInvitation[]\n requests HouseRequest[]\n\n @@index([creatorId])\n @@index([name])\n}\n\nmodel HouseMembership {\n id String @id @default(cuid())\n houseId String\n userId String\n role HouseRole @default(MEMBER)\n joinedAt DateTime @default(now())\n house House @relation(fields: [houseId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([houseId, userId])\n @@index([houseId])\n @@index([userId])\n}\n\nmodel HouseInvitation {\n id String @id @default(cuid())\n houseId String\n inviterId String // Utilisateur qui envoie l'invitation\n inviteeId String // Utilisateur invité\n status InvitationStatus @default(PENDING)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n house House @relation(fields: [houseId], references: [id], onDelete: Cascade)\n inviter User @relation(\"Inviter\", fields: [inviterId], references: [id], onDelete: Cascade)\n invitee User @relation(\"Invitee\", fields: [inviteeId], references: [id], onDelete: Cascade)\n\n @@unique([houseId, inviteeId])\n @@index([houseId])\n @@index([inviteeId])\n @@index([status])\n}\n\nmodel HouseRequest {\n id String @id @default(cuid())\n houseId String\n requesterId String // Utilisateur qui demande à rejoindre\n status RequestStatus @default(PENDING)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n house House @relation(fields: [houseId], references: [id], onDelete: Cascade)\n requester User @relation(\"Requester\", fields: [requesterId], references: [id], onDelete: Cascade)\n\n @@unique([houseId, requesterId])\n @@index([houseId])\n @@index([requesterId])\n @@index([status])\n}\n\nenum HouseRole {\n OWNER\n ADMIN\n MEMBER\n}\n\nenum InvitationStatus {\n PENDING\n ACCEPTED\n REJECTED\n CANCELLED\n}\n\nenum RequestStatus {\n PENDING\n ACCEPTED\n REJECTED\n CANCELLED\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -28,7 +28,7 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"username\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"level\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxHp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"xp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxXp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"characterClass\",\"kind\":\"enum\",\"type\":\"CharacterClass\"},{\"name\":\"eventFeedbacks\",\"kind\":\"object\",\"type\":\"EventFeedback\",\"relationName\":\"EventFeedbackToUser\"},{\"name\":\"eventRegistrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventRegistrationToUser\"},{\"name\":\"preferences\",\"kind\":\"object\",\"type\":\"UserPreferences\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"challengesAsChallenger\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"Challenger\"},{\"name\":\"challengesAsChallenged\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"Challenged\"},{\"name\":\"challengesAsAdmin\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"AdminValidator\"},{\"name\":\"challengesAsWinner\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeWinner\"},{\"name\":\"houseMemberships\",\"kind\":\"object\",\"type\":\"HouseMembership\",\"relationName\":\"HouseMembershipToUser\"},{\"name\":\"houseInvitationsSent\",\"kind\":\"object\",\"type\":\"HouseInvitation\",\"relationName\":\"Inviter\"},{\"name\":\"houseInvitationsReceived\",\"kind\":\"object\",\"type\":\"HouseInvitation\",\"relationName\":\"Invitee\"},{\"name\":\"houseRequestsSent\",\"kind\":\"object\",\"type\":\"HouseRequest\",\"relationName\":\"Requester\"},{\"name\":\"housesCreated\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseCreator\"}],\"dbName\":null},\"UserPreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"theme\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserPreferences\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"room\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"time\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"maxPlaces\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"feedbacks\",\"kind\":\"object\",\"type\":\"EventFeedback\",\"relationName\":\"EventToEventFeedback\"},{\"name\":\"registrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventToEventRegistration\"}],\"dbName\":null},\"EventRegistration\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventRegistration\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventRegistrationToUser\"}],\"dbName\":null},\"EventFeedback\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"comment\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isRead\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventFeedback\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventFeedbackToUser\"}],\"dbName\":null},\"SitePreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengesBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventRegistrationPoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"eventFeedbackPoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"houseJoinPoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"houseLeavePoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"houseCreatePoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Challenge\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengedId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenger\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Challenger\"},{\"name\":\"challenged\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Challenged\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"pointsReward\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ChallengeStatus\"},{\"name\":\"adminId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"admin\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AdminValidator\"},{\"name\":\"adminComment\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"winnerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"winner\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ChallengeWinner\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"House\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"creatorId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"creator\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HouseCreator\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"memberships\",\"kind\":\"object\",\"type\":\"HouseMembership\",\"relationName\":\"HouseToHouseMembership\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"HouseInvitation\",\"relationName\":\"HouseToHouseInvitation\"},{\"name\":\"requests\",\"kind\":\"object\",\"type\":\"HouseRequest\",\"relationName\":\"HouseToHouseRequest\"}],\"dbName\":null},\"HouseMembership\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"HouseRole\"},{\"name\":\"joinedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"house\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseToHouseMembership\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HouseMembershipToUser\"}],\"dbName\":null},\"HouseInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inviterId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inviteeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"InvitationStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"house\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseToHouseInvitation\"},{\"name\":\"inviter\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Inviter\"},{\"name\":\"invitee\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Invitee\"}],\"dbName\":null},\"HouseRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requesterId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"RequestStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"house\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseToHouseRequest\"},{\"name\":\"requester\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Requester\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"username\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"level\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"hp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxHp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"xp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"maxXp\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"characterClass\",\"kind\":\"enum\",\"type\":\"CharacterClass\"},{\"name\":\"eventFeedbacks\",\"kind\":\"object\",\"type\":\"EventFeedback\",\"relationName\":\"EventFeedbackToUser\"},{\"name\":\"eventRegistrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventRegistrationToUser\"},{\"name\":\"preferences\",\"kind\":\"object\",\"type\":\"UserPreferences\",\"relationName\":\"UserToUserPreferences\"},{\"name\":\"challengesAsChallenger\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"Challenger\"},{\"name\":\"challengesAsChallenged\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"Challenged\"},{\"name\":\"challengesAsAdmin\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"AdminValidator\"},{\"name\":\"challengesAsWinner\",\"kind\":\"object\",\"type\":\"Challenge\",\"relationName\":\"ChallengeWinner\"},{\"name\":\"houseMemberships\",\"kind\":\"object\",\"type\":\"HouseMembership\",\"relationName\":\"HouseMembershipToUser\"},{\"name\":\"houseInvitationsSent\",\"kind\":\"object\",\"type\":\"HouseInvitation\",\"relationName\":\"Inviter\"},{\"name\":\"houseInvitationsReceived\",\"kind\":\"object\",\"type\":\"HouseInvitation\",\"relationName\":\"Invitee\"},{\"name\":\"houseRequestsSent\",\"kind\":\"object\",\"type\":\"HouseRequest\",\"relationName\":\"Requester\"},{\"name\":\"housesCreated\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseCreator\"}],\"dbName\":null},\"UserPreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"theme\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserPreferences\"}],\"dbName\":null},\"Event\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"EventType\"},{\"name\":\"room\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"time\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"maxPlaces\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"feedbacks\",\"kind\":\"object\",\"type\":\"EventFeedback\",\"relationName\":\"EventToEventFeedback\"},{\"name\":\"registrations\",\"kind\":\"object\",\"type\":\"EventRegistration\",\"relationName\":\"EventToEventRegistration\"}],\"dbName\":null},\"EventRegistration\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventRegistration\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventRegistrationToUser\"}],\"dbName\":null},\"EventFeedback\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"comment\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isRead\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"event\",\"kind\":\"object\",\"type\":\"Event\",\"relationName\":\"EventToEventFeedback\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"EventFeedbackToUser\"}],\"dbName\":null},\"SitePreferences\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventsBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"leaderboardBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengesBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseBackground\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"eventRegistrationPoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"eventFeedbackPoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"houseJoinPoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"houseLeavePoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"houseCreatePoints\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Challenge\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengedId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challenger\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Challenger\"},{\"name\":\"challenged\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Challenged\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"pointsReward\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ChallengeStatus\"},{\"name\":\"adminId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"admin\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AdminValidator\"},{\"name\":\"adminComment\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"winnerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"winner\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ChallengeWinner\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"House\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"creatorId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"creator\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HouseCreator\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"memberships\",\"kind\":\"object\",\"type\":\"HouseMembership\",\"relationName\":\"HouseToHouseMembership\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"HouseInvitation\",\"relationName\":\"HouseToHouseInvitation\"},{\"name\":\"requests\",\"kind\":\"object\",\"type\":\"HouseRequest\",\"relationName\":\"HouseToHouseRequest\"}],\"dbName\":null},\"HouseMembership\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"HouseRole\"},{\"name\":\"joinedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"house\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseToHouseMembership\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HouseMembershipToUser\"}],\"dbName\":null},\"HouseInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inviterId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inviteeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"InvitationStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"house\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseToHouseInvitation\"},{\"name\":\"inviter\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Inviter\"},{\"name\":\"invitee\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Invitee\"}],\"dbName\":null},\"HouseRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"houseId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requesterId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"RequestStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"house\",\"kind\":\"object\",\"type\":\"House\",\"relationName\":\"HouseToHouseRequest\"},{\"name\":\"requester\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"Requester\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") async function decodeBase64AsWasm(wasmBase64: string): Promise { const { Buffer } = await import('node:buffer') diff --git a/prisma/generated/prisma/internal/prismaNamespace.ts b/prisma/generated/prisma/internal/prismaNamespace.ts index 3500c72..5034cdf 100644 --- a/prisma/generated/prisma/internal/prismaNamespace.ts +++ b/prisma/generated/prisma/internal/prismaNamespace.ts @@ -1349,6 +1349,8 @@ export const SitePreferencesScalarFieldEnum = { eventsBackground: 'eventsBackground', leaderboardBackground: 'leaderboardBackground', challengesBackground: 'challengesBackground', + profileBackground: 'profileBackground', + houseBackground: 'houseBackground', eventRegistrationPoints: 'eventRegistrationPoints', eventFeedbackPoints: 'eventFeedbackPoints', houseJoinPoints: 'houseJoinPoints', diff --git a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts index f6127ef..0d4e67b 100644 --- a/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/prisma/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -162,6 +162,8 @@ export const SitePreferencesScalarFieldEnum = { eventsBackground: 'eventsBackground', leaderboardBackground: 'leaderboardBackground', challengesBackground: 'challengesBackground', + profileBackground: 'profileBackground', + houseBackground: 'houseBackground', eventRegistrationPoints: 'eventRegistrationPoints', eventFeedbackPoints: 'eventFeedbackPoints', houseJoinPoints: 'houseJoinPoints', diff --git a/prisma/generated/prisma/models/SitePreferences.ts b/prisma/generated/prisma/models/SitePreferences.ts index 008078d..e101d9e 100644 --- a/prisma/generated/prisma/models/SitePreferences.ts +++ b/prisma/generated/prisma/models/SitePreferences.ts @@ -48,6 +48,8 @@ export type SitePreferencesMinAggregateOutputType = { eventsBackground: string | null leaderboardBackground: string | null challengesBackground: string | null + profileBackground: string | null + houseBackground: string | null eventRegistrationPoints: number | null eventFeedbackPoints: number | null houseJoinPoints: number | null @@ -63,6 +65,8 @@ export type SitePreferencesMaxAggregateOutputType = { eventsBackground: string | null leaderboardBackground: string | null challengesBackground: string | null + profileBackground: string | null + houseBackground: string | null eventRegistrationPoints: number | null eventFeedbackPoints: number | null houseJoinPoints: number | null @@ -78,6 +82,8 @@ export type SitePreferencesCountAggregateOutputType = { eventsBackground: number leaderboardBackground: number challengesBackground: number + profileBackground: number + houseBackground: number eventRegistrationPoints: number eventFeedbackPoints: number houseJoinPoints: number @@ -111,6 +117,8 @@ export type SitePreferencesMinAggregateInputType = { eventsBackground?: true leaderboardBackground?: true challengesBackground?: true + profileBackground?: true + houseBackground?: true eventRegistrationPoints?: true eventFeedbackPoints?: true houseJoinPoints?: true @@ -126,6 +134,8 @@ export type SitePreferencesMaxAggregateInputType = { eventsBackground?: true leaderboardBackground?: true challengesBackground?: true + profileBackground?: true + houseBackground?: true eventRegistrationPoints?: true eventFeedbackPoints?: true houseJoinPoints?: true @@ -141,6 +151,8 @@ export type SitePreferencesCountAggregateInputType = { eventsBackground?: true leaderboardBackground?: true challengesBackground?: true + profileBackground?: true + houseBackground?: true eventRegistrationPoints?: true eventFeedbackPoints?: true houseJoinPoints?: true @@ -243,6 +255,8 @@ export type SitePreferencesGroupByOutputType = { eventsBackground: string | null leaderboardBackground: string | null challengesBackground: string | null + profileBackground: string | null + houseBackground: string | null eventRegistrationPoints: number eventFeedbackPoints: number houseJoinPoints: number @@ -281,6 +295,8 @@ export type SitePreferencesWhereInput = { eventsBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null leaderboardBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null challengesBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null + profileBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null + houseBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null eventRegistrationPoints?: Prisma.IntFilter<"SitePreferences"> | number eventFeedbackPoints?: Prisma.IntFilter<"SitePreferences"> | number houseJoinPoints?: Prisma.IntFilter<"SitePreferences"> | number @@ -296,6 +312,8 @@ export type SitePreferencesOrderByWithRelationInput = { eventsBackground?: Prisma.SortOrderInput | Prisma.SortOrder leaderboardBackground?: Prisma.SortOrderInput | Prisma.SortOrder challengesBackground?: Prisma.SortOrderInput | Prisma.SortOrder + profileBackground?: Prisma.SortOrderInput | Prisma.SortOrder + houseBackground?: Prisma.SortOrderInput | Prisma.SortOrder eventRegistrationPoints?: Prisma.SortOrder eventFeedbackPoints?: Prisma.SortOrder houseJoinPoints?: Prisma.SortOrder @@ -314,6 +332,8 @@ export type SitePreferencesWhereUniqueInput = Prisma.AtLeast<{ eventsBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null leaderboardBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null challengesBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null + profileBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null + houseBackground?: Prisma.StringNullableFilter<"SitePreferences"> | string | null eventRegistrationPoints?: Prisma.IntFilter<"SitePreferences"> | number eventFeedbackPoints?: Prisma.IntFilter<"SitePreferences"> | number houseJoinPoints?: Prisma.IntFilter<"SitePreferences"> | number @@ -329,6 +349,8 @@ export type SitePreferencesOrderByWithAggregationInput = { eventsBackground?: Prisma.SortOrderInput | Prisma.SortOrder leaderboardBackground?: Prisma.SortOrderInput | Prisma.SortOrder challengesBackground?: Prisma.SortOrderInput | Prisma.SortOrder + profileBackground?: Prisma.SortOrderInput | Prisma.SortOrder + houseBackground?: Prisma.SortOrderInput | Prisma.SortOrder eventRegistrationPoints?: Prisma.SortOrder eventFeedbackPoints?: Prisma.SortOrder houseJoinPoints?: Prisma.SortOrder @@ -352,6 +374,8 @@ export type SitePreferencesScalarWhereWithAggregatesInput = { eventsBackground?: Prisma.StringNullableWithAggregatesFilter<"SitePreferences"> | string | null leaderboardBackground?: Prisma.StringNullableWithAggregatesFilter<"SitePreferences"> | string | null challengesBackground?: Prisma.StringNullableWithAggregatesFilter<"SitePreferences"> | string | null + profileBackground?: Prisma.StringNullableWithAggregatesFilter<"SitePreferences"> | string | null + houseBackground?: Prisma.StringNullableWithAggregatesFilter<"SitePreferences"> | string | null eventRegistrationPoints?: Prisma.IntWithAggregatesFilter<"SitePreferences"> | number eventFeedbackPoints?: Prisma.IntWithAggregatesFilter<"SitePreferences"> | number houseJoinPoints?: Prisma.IntWithAggregatesFilter<"SitePreferences"> | number @@ -367,6 +391,8 @@ export type SitePreferencesCreateInput = { eventsBackground?: string | null leaderboardBackground?: string | null challengesBackground?: string | null + profileBackground?: string | null + houseBackground?: string | null eventRegistrationPoints?: number eventFeedbackPoints?: number houseJoinPoints?: number @@ -382,6 +408,8 @@ export type SitePreferencesUncheckedCreateInput = { eventsBackground?: string | null leaderboardBackground?: string | null challengesBackground?: string | null + profileBackground?: string | null + houseBackground?: string | null eventRegistrationPoints?: number eventFeedbackPoints?: number houseJoinPoints?: number @@ -397,6 +425,8 @@ export type SitePreferencesUpdateInput = { eventsBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null leaderboardBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null challengesBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + profileBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + houseBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null eventRegistrationPoints?: Prisma.IntFieldUpdateOperationsInput | number eventFeedbackPoints?: Prisma.IntFieldUpdateOperationsInput | number houseJoinPoints?: Prisma.IntFieldUpdateOperationsInput | number @@ -412,6 +442,8 @@ export type SitePreferencesUncheckedUpdateInput = { eventsBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null leaderboardBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null challengesBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + profileBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + houseBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null eventRegistrationPoints?: Prisma.IntFieldUpdateOperationsInput | number eventFeedbackPoints?: Prisma.IntFieldUpdateOperationsInput | number houseJoinPoints?: Prisma.IntFieldUpdateOperationsInput | number @@ -427,6 +459,8 @@ export type SitePreferencesCreateManyInput = { eventsBackground?: string | null leaderboardBackground?: string | null challengesBackground?: string | null + profileBackground?: string | null + houseBackground?: string | null eventRegistrationPoints?: number eventFeedbackPoints?: number houseJoinPoints?: number @@ -442,6 +476,8 @@ export type SitePreferencesUpdateManyMutationInput = { eventsBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null leaderboardBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null challengesBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + profileBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + houseBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null eventRegistrationPoints?: Prisma.IntFieldUpdateOperationsInput | number eventFeedbackPoints?: Prisma.IntFieldUpdateOperationsInput | number houseJoinPoints?: Prisma.IntFieldUpdateOperationsInput | number @@ -457,6 +493,8 @@ export type SitePreferencesUncheckedUpdateManyInput = { eventsBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null leaderboardBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null challengesBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + profileBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + houseBackground?: Prisma.NullableStringFieldUpdateOperationsInput | string | null eventRegistrationPoints?: Prisma.IntFieldUpdateOperationsInput | number eventFeedbackPoints?: Prisma.IntFieldUpdateOperationsInput | number houseJoinPoints?: Prisma.IntFieldUpdateOperationsInput | number @@ -472,6 +510,8 @@ export type SitePreferencesCountOrderByAggregateInput = { eventsBackground?: Prisma.SortOrder leaderboardBackground?: Prisma.SortOrder challengesBackground?: Prisma.SortOrder + profileBackground?: Prisma.SortOrder + houseBackground?: Prisma.SortOrder eventRegistrationPoints?: Prisma.SortOrder eventFeedbackPoints?: Prisma.SortOrder houseJoinPoints?: Prisma.SortOrder @@ -495,6 +535,8 @@ export type SitePreferencesMaxOrderByAggregateInput = { eventsBackground?: Prisma.SortOrder leaderboardBackground?: Prisma.SortOrder challengesBackground?: Prisma.SortOrder + profileBackground?: Prisma.SortOrder + houseBackground?: Prisma.SortOrder eventRegistrationPoints?: Prisma.SortOrder eventFeedbackPoints?: Prisma.SortOrder houseJoinPoints?: Prisma.SortOrder @@ -510,6 +552,8 @@ export type SitePreferencesMinOrderByAggregateInput = { eventsBackground?: Prisma.SortOrder leaderboardBackground?: Prisma.SortOrder challengesBackground?: Prisma.SortOrder + profileBackground?: Prisma.SortOrder + houseBackground?: Prisma.SortOrder eventRegistrationPoints?: Prisma.SortOrder eventFeedbackPoints?: Prisma.SortOrder houseJoinPoints?: Prisma.SortOrder @@ -535,6 +579,8 @@ export type SitePreferencesSelect = runtime.Types.Extensions.GetOmit<"id" | "homeBackground" | "eventsBackground" | "leaderboardBackground" | "challengesBackground" | "eventRegistrationPoints" | "eventFeedbackPoints" | "houseJoinPoints" | "houseLeavePoints" | "houseCreatePoints" | "createdAt" | "updatedAt", ExtArgs["result"]["sitePreferences"]> +export type SitePreferencesOmit = runtime.Types.Extensions.GetOmit<"id" | "homeBackground" | "eventsBackground" | "leaderboardBackground" | "challengesBackground" | "profileBackground" | "houseBackground" | "eventRegistrationPoints" | "eventFeedbackPoints" | "houseJoinPoints" | "houseLeavePoints" | "houseCreatePoints" | "createdAt" | "updatedAt", ExtArgs["result"]["sitePreferences"]> export type $SitePreferencesPayload = { name: "SitePreferences" @@ -600,6 +652,8 @@ export type $SitePreferencesPayload readonly leaderboardBackground: Prisma.FieldRef<"SitePreferences", 'String'> readonly challengesBackground: Prisma.FieldRef<"SitePreferences", 'String'> + readonly profileBackground: Prisma.FieldRef<"SitePreferences", 'String'> + readonly houseBackground: Prisma.FieldRef<"SitePreferences", 'String'> readonly eventRegistrationPoints: Prisma.FieldRef<"SitePreferences", 'Int'> readonly eventFeedbackPoints: Prisma.FieldRef<"SitePreferences", 'Int'> readonly houseJoinPoints: Prisma.FieldRef<"SitePreferences", 'Int'> diff --git a/prisma/migrations/20250116000000_add_profile_background/migration.sql b/prisma/migrations/20250116000000_add_profile_background/migration.sql new file mode 100644 index 0000000..7d5a9fb --- /dev/null +++ b/prisma/migrations/20250116000000_add_profile_background/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "SitePreferences" ADD COLUMN "profileBackground" TEXT; + diff --git a/prisma/migrations/20250116000001_add_house_background/migration.sql b/prisma/migrations/20250116000001_add_house_background/migration.sql new file mode 100644 index 0000000..bae9e09 --- /dev/null +++ b/prisma/migrations/20250116000001_add_house_background/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "SitePreferences" ADD COLUMN "houseBackground" TEXT; + diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 052a4e7..16f692b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -107,6 +107,8 @@ model SitePreferences { eventsBackground String? leaderboardBackground String? challengesBackground String? + profileBackground String? + houseBackground String? eventRegistrationPoints Int @default(100) eventFeedbackPoints Int @default(100) houseJoinPoints Int @default(100) diff --git a/services/preferences/site-preferences.service.ts b/services/preferences/site-preferences.service.ts index d72c56a..67b245c 100644 --- a/services/preferences/site-preferences.service.ts +++ b/services/preferences/site-preferences.service.ts @@ -14,6 +14,8 @@ export interface UpdateSitePreferencesInput { eventsBackground?: string | null; leaderboardBackground?: string | null; challengesBackground?: string | null; + profileBackground?: string | null; + houseBackground?: string | null; eventRegistrationPoints?: number; eventFeedbackPoints?: number; houseJoinPoints?: number; @@ -50,6 +52,8 @@ export class SitePreferencesService { eventsBackground: null, leaderboardBackground: null, challengesBackground: null, + profileBackground: null, + houseBackground: null, eventRegistrationPoints: 100, eventFeedbackPoints: 100, houseJoinPoints: 100, @@ -93,6 +97,14 @@ export class SitePreferencesService { data.challengesBackground === "" ? null : (data.challengesBackground ?? undefined), + profileBackground: + data.profileBackground === "" + ? null + : (data.profileBackground ?? undefined), + houseBackground: + data.houseBackground === "" + ? null + : (data.houseBackground ?? undefined), eventRegistrationPoints: data.eventRegistrationPoints !== undefined ? data.eventRegistrationPoints @@ -126,6 +138,12 @@ export class SitePreferencesService { data.challengesBackground === "" ? null : (data.challengesBackground ?? null), + profileBackground: + data.profileBackground === "" + ? null + : (data.profileBackground ?? null), + houseBackground: + data.houseBackground === "" ? null : (data.houseBackground ?? null), eventRegistrationPoints: data.eventRegistrationPoints ?? 100, eventFeedbackPoints: data.eventFeedbackPoints ?? 100, houseJoinPoints: data.houseJoinPoints ?? 100, @@ -139,7 +157,13 @@ export class SitePreferencesService { * Récupère l'image de fond pour une page donnée */ async getBackgroundImage( - page: "home" | "events" | "leaderboard" | "challenges", + page: + | "home" + | "events" + | "leaderboard" + | "challenges" + | "profile" + | "houses", defaultImage: string ): Promise { try { @@ -151,7 +175,9 @@ export class SitePreferencesService { return defaultImage; } - const imageKey = `${page}Background` as keyof typeof sitePreferences; + // Mapping spécial pour "houses" -> "house" (car la colonne est houseBackground) + const dbPage = page === "houses" ? "house" : page; + const imageKey = `${dbPage}Background` as keyof typeof sitePreferences; const customImage = sitePreferences[imageKey]; const imageUrl = (customImage as string | null) || defaultImage;