124 lines
3.1 KiB
Text
124 lines
3.1 KiB
Text
// This is your Prisma schema file,
|
||
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
||
|
||
generator client {
|
||
provider = "prisma-client-js"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "postgresql"
|
||
}
|
||
|
||
model User {
|
||
id String @id @default(uuid())
|
||
email String? @unique
|
||
name String?
|
||
createdAt DateTime @default(now())
|
||
|
||
// Связи
|
||
hostedRooms Room[] @relation("HostedRooms")
|
||
participants Participant[]
|
||
questionPacks QuestionPack[]
|
||
|
||
// Статистика
|
||
gamesPlayed Int @default(0)
|
||
gamesWon Int @default(0)
|
||
totalPoints Int @default(0)
|
||
}
|
||
|
||
model Room {
|
||
id String @id @default(uuid())
|
||
code String @unique // 6-символьный код
|
||
status RoomStatus @default(WAITING)
|
||
hostId String
|
||
createdAt DateTime @default(now())
|
||
expiresAt DateTime
|
||
|
||
// Настройки
|
||
maxPlayers Int @default(10)
|
||
allowSpectators Boolean @default(true)
|
||
timerEnabled Boolean @default(false)
|
||
timerDuration Int @default(30)
|
||
questionPackId String
|
||
autoAdvance Boolean @default(false)
|
||
|
||
// Состояние игры
|
||
currentQuestionIndex Int @default(0)
|
||
revealedAnswers Json @default("{}")
|
||
currentPlayerId String?
|
||
isGameOver Boolean @default(false)
|
||
|
||
// Метрики
|
||
totalQuestions Int @default(0)
|
||
answeredQuestions Int @default(0)
|
||
startedAt DateTime?
|
||
finishedAt DateTime?
|
||
|
||
// Связи
|
||
host User @relation("HostedRooms", fields: [hostId], references: [id])
|
||
participants Participant[]
|
||
questionPack QuestionPack @relation(fields: [questionPackId], references: [id])
|
||
gameHistory GameHistory?
|
||
}
|
||
|
||
enum RoomStatus {
|
||
WAITING
|
||
PLAYING
|
||
FINISHED
|
||
}
|
||
|
||
model Participant {
|
||
id String @id @default(uuid())
|
||
userId String
|
||
roomId String
|
||
name String
|
||
role ParticipantRole
|
||
score Int @default(0)
|
||
joinedAt DateTime @default(now())
|
||
isActive Boolean @default(true)
|
||
|
||
user User @relation(fields: [userId], references: [id])
|
||
room Room @relation(fields: [roomId], references: [id], onDelete: Cascade)
|
||
|
||
@@unique([userId, roomId])
|
||
}
|
||
|
||
enum ParticipantRole {
|
||
HOST
|
||
PLAYER
|
||
SPECTATOR
|
||
}
|
||
|
||
model QuestionPack {
|
||
id String @id @default(uuid())
|
||
name String
|
||
description String
|
||
category String
|
||
isPublic Boolean @default(false)
|
||
createdBy String
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
questions Json // Массив вопросов с ответами
|
||
questionCount Int @default(0)
|
||
timesUsed Int @default(0)
|
||
rating Float @default(0)
|
||
|
||
creator User @relation(fields: [createdBy], references: [id])
|
||
rooms Room[]
|
||
}
|
||
|
||
model GameHistory {
|
||
id String @id @default(uuid())
|
||
roomId String @unique
|
||
roomCode String
|
||
questionPackId String
|
||
startedAt DateTime
|
||
finishedAt DateTime
|
||
|
||
players Json // { userId: { name, score, rank } }
|
||
statistics Json // Детальная статистика игры
|
||
timeline Json // История событий игры
|
||
|
||
room Room @relation(fields: [roomId], references: [id], onDelete: Cascade)
|
||
}
|