test / gameserv /prisma /schema.prisma
dcrey7's picture
Upload 522 files
811126d verified
raw
history blame
3.65 kB
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
voiceId String? // ID ElevenLabs pour la voix clonée
voiceLanguage String?
audioUrl String? // URL de l'enregistrement original
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
groups GroupMember[]
invitations Invitation[] @relation("InvitedUser")
createdGroups Group[] @relation("GroupCreator")
}
model Group {
id Int @id @default(autoincrement())
name String
inviteCode String @unique // Code d'invitation unique
status String @default("WAITING") // WAITING, PLAYING, FINISHED
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creator User @relation("GroupCreator", fields: [creatorId], references: [id])
creatorId Int
members GroupMember[]
invitations Invitation[]
gameState GameState?
}
model GroupMember {
id Int @id @default(autoincrement())
group Group @relation(fields: [groupId], references: [id])
groupId Int
user User @relation(fields: [userId], references: [id])
userId Int
joinedAt DateTime @default(now())
isReady Boolean @default(false) // Indique si le joueur a soumis sa voix
@@unique([groupId, userId])
}
model Invitation {
id Int @id @default(autoincrement())
group Group @relation(fields: [groupId], references: [id])
groupId Int
user User? @relation("InvitedUser", fields: [userId], references: [id])
userId Int?
email String? // Pour inviter des utilisateurs non inscrits
status InvitationStatus @default(PENDING)
createdAt DateTime @default(now())
expiresAt DateTime?
}
model GameState {
id Int @id @default(autoincrement())
group Group @relation(fields: [groupId], references: [id])
groupId Int @unique
status GameStatus @default(WAITING)
stolenVoicePlayerId Int? // ID du joueur dont la voix est volée
currentRound Int @default(0)
startedAt DateTime?
endedAt DateTime?
rounds GameRound[]
}
model GameRound {
id Int @id @default(autoincrement())
gameState GameState @relation(fields: [gameStateId], references: [id])
gameStateId Int
roundNumber Int
speakerId Int // ID du joueur qui parle
guesses Guess[]
startedAt DateTime @default(now())
endedAt DateTime?
}
model Guess {
id Int @id @default(autoincrement())
gameRound GameRound @relation(fields: [gameRoundId], references: [id])
gameRoundId Int
guesserId Int // ID du joueur qui devine
guessedId Int // ID du joueur deviné
isCorrect Boolean
createdAt DateTime @default(now())
}
enum InvitationStatus {
PENDING
ACCEPTED
DECLINED
EXPIRED
}
enum GameStatus {
WAITING // En attente que tous les joueurs soumettent leur voix
ANSWERS // Les joueurs répondent à la question
DEBATE // Phase de débat
VOTE // Phase de vote
FINISHED // Partie terminée
CANCELLED // Partie annulée
}