126 lines
3.1 KiB
Text
126 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"
|
|||
|
|
url = env("DATABASE_URL")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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)
|
|||
|
|
}
|