/
kochkatech
/
CorpGame
Обзор
Документация
Войти
/
kochkatech
/
CorpGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
dev
backend/prisma/schema.prisma
160 строк
6 KB
kochkareal
chore: добавлен .gitattributes, нормализованы переносы строк (LF везде, кроме .bat/.cmd)
06 авг 2026, 15:18
06 авг 2026, 15:18
c25ef1b
Код
Авторство
О чём код?
generator client { provider = "prisma-client-js" // "windows" явно — на случай, если портативную сборку когда-нибудь соберут из WSL/Linux: // без этого в ZIP уедет линуксовый движок, и на ноутбуке ведущего Prisma упадёт с // «Query engine binary for current platform could not be found». binaryTargets = ["native", "windows"] } // SQLite, а не Postgres: игра поднимается одним процессом на ноутбуке ведущего, данные // одноразовые (сброс = удалить папку data), нагрузка — десятки записей в секунду. // Целый контейнер с СУБД ради этого не нужен. // // Json и enum на SQLite поддерживаются начиная с Prisma 6.2 — поэтому модели ниже // не пришлось менять вообще. Две особенности коннектора: // * enum — это TEXT без CHECK на уровне БД, значения валидирует Prisma; // * PRAGMA foreign_keys включается автоматически, поэтому onDelete: Cascade работает. // // URL всегда абсолютный (file:C:/.../data/corpgame.db): относительные file:-пути Prisma // резолвит от каталога этого файла, а не от рабочей директории — база молча создалась бы // внутри папки app/, которую обновление затирает. datasource db { provider = "sqlite" url = env("DATABASE_URL") } enum SessionStatus { LOBBY RUNNING PAUSED FINISHED } model GameSession { id String @id @default(uuid()) publicCode String @unique status SessionStatus @default(LOBBY) durationSec Int startedAt DateTime? pausedAt DateTime? accumulatedPauseSec Int @default(0) transferEnabled Boolean @default(true) sanctionsEnabled Boolean @default(true) theftEnabled Boolean @default(true) /// Баланс: ресурсы, типы филиалов, цены, стартовые значения — см. default-config.ts config Json teams Team[] events EventLog[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Team { id String @id @default(uuid()) sessionId String name String joinCode String score Int @default(0) /// Текущее количество ресурсов, ключи соответствуют GameSession.config.resources resources Json theftsUsed Int @default(0) sanctionsUsed Int @default(0) /// Множитель КД сбора от временного эффекта администратора (1 = обычная скорость) cooldownMultiplier Float @default(1) cooldownEffectUntil DateTime? session GameSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) players Player[] branches Branch[] actorEvents EventLog[] @relation("ActorTeam") targetEvents EventLog[] @relation("TargetTeam") theftsAsActor TheftAttempt[] @relation("TheftActor") theftsAsTarget TheftAttempt[] @relation("TheftTarget") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([sessionId, joinCode]) } model Player { id String @id @default(uuid()) teamId String nickname String socketId String? team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) } model Branch { id String @id @default(uuid()) teamId String /// Ключ города из GameSession.config.cities cityKey String level Int @default(1) /// Когда снова можно собрать ресурс; null — ещё ни разу не собирали (доступно сразу) nextCollectAt DateTime? /// Временное замедление КД от санкции (санкции понижают уровень, но если некуда — замедляют) slowedUntil DateTime? slowMultiplier Float @default(1) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt /// Нельзя открыть один и тот же город дважды одной командой — заслон от гонки при двойном клике @@unique([teamId, cityKey]) } enum TheftStatus { PENDING SUCCESS CAUGHT } model TheftAttempt { id String @id @default(uuid()) sessionId String actorTeamId String targetTeamId String resource String status TheftStatus @default(PENDING) startedAt DateTime @default(now()) expiresAt DateTime /// Id команд, предложенных жертве для угадывания (среди них обязательно настоящий вор) optionTeamIds Json guessTeamId String? actorTeam Team @relation("TheftActor", fields: [actorTeamId], references: [id], onDelete: Cascade) targetTeam Team @relation("TheftTarget", fields: [targetTeamId], references: [id], onDelete: Cascade) @@index([status, expiresAt]) } model EventLog { id String @id @default(uuid()) sessionId String type String actorTeamId String? targetTeamId String? /// Произвольные детали события (сумма ресурса, тип санкции и т.п.) payload Json? createdAt DateTime @default(now()) session GameSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) actorTeam Team? @relation("ActorTeam", fields: [actorTeamId], references: [id]) targetTeam Team? @relation("TargetTeam", fields: [targetTeamId], references: [id]) @@index([sessionId, createdAt]) }