generator client { provider = "prisma-client" output = "./generated/prisma" } datasource db { provider = "sqlite" } model User { id String @id @default(cuid()) email String @unique password String username String @unique role Role @default(USER) score Int @default(0) level Int @default(1) hp Int @default(1000) maxHp Int @default(1000) xp Int @default(0) maxXp Int @default(5000) avatar String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt bio String? characterClass CharacterClass? eventFeedbacks EventFeedback[] eventRegistrations EventRegistration[] preferences UserPreferences? challengesAsChallenger Challenge[] @relation("Challenger") challengesAsChallenged Challenge[] @relation("Challenged") challengesAsAdmin Challenge[] @relation("AdminValidator") challengesAsWinner Challenge[] @relation("ChallengeWinner") @@index([score]) @@index([email]) } model UserPreferences { id String @id @default(cuid()) userId String @unique homeBackground String? eventsBackground String? leaderboardBackground String? theme String? @default("default") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Event { id String @id @default(cuid()) date DateTime name String description String type EventType room String? time String? maxPlaces Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt feedbacks EventFeedback[] registrations EventRegistration[] @@index([date]) } model EventRegistration { id String @id @default(cuid()) userId String eventId String createdAt DateTime @default(now()) event Event @relation(fields: [eventId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, eventId]) @@index([userId]) @@index([eventId]) } model EventFeedback { id String @id @default(cuid()) userId String eventId String rating Int comment String? isRead Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt event Event @relation(fields: [eventId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, eventId]) @@index([userId]) @@index([eventId]) @@index([isRead]) } model SitePreferences { id String @id @default("global") homeBackground String? eventsBackground String? leaderboardBackground String? challengesBackground String? eventRegistrationPoints Int @default(100) eventFeedbackPoints Int @default(100) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } enum Role { USER ADMIN } enum EventType { ATELIER KATA PRESENTATION LEARNING_HOUR } enum CharacterClass { WARRIOR MAGE ROGUE RANGER PALADIN ENGINEER MERCHANT SCHOLAR BERSERKER NECROMANCER } enum ChallengeStatus { PENDING ACCEPTED COMPLETED REJECTED CANCELLED } model Challenge { id String @id @default(cuid()) challengerId String // Joueur qui lance le défi challengedId String // Joueur qui reçoit le défi challenger User @relation("Challenger", fields: [challengerId], references: [id], onDelete: Cascade) challenged User @relation("Challenged", fields: [challengedId], references: [id], onDelete: Cascade) title String // Titre du défi description String // Description détaillée du défi pointsReward Int @default(100) // Points à gagner pour le gagnant status ChallengeStatus @default(PENDING) adminId String? // Admin qui valide le défi admin User? @relation("AdminValidator", fields: [adminId], references: [id], onDelete: SetNull) adminComment String? // Commentaire de l'admin lors de la validation/rejet winnerId String? // ID du gagnant (challengerId ou challengedId) winner User? @relation("ChallengeWinner", fields: [winnerId], references: [id], onDelete: SetNull) createdAt DateTime @default(now()) acceptedAt DateTime? // Date d'acceptation du défi completedAt DateTime? // Date de validation par l'admin updatedAt DateTime @updatedAt @@index([challengerId]) @@index([challengedId]) @@index([status]) @@index([adminId]) }