Files
core2026/packages/infra/prisma/game.prisma
T
Hide_D fa9cee36cf fix: 게임 outbox 운영 시각을 UTC wall로 통일한다
KST 세션에서 ReadModel과 WebPush outbox의 producer provenance를 분리하고 due, lease, retention 비교를 UTC wall 계약으로 맞춘다.

기존 TIMESTAMP(3) 타입과 이전 DML 형태를 유지하면서 populated upgrade, pending requeue, delivered 보존과 두 번째 deploy no-op을 자동 검증한다.
2026-08-24 07:40:45 +00:00

943 lines
30 KiB
Plaintext

generator client {
provider = "prisma-client-js"
output = "./generated/game"
engineType = "binary"
}
datasource db {
provider = "postgresql"
}
enum LogScope {
SYSTEM
NATION
GENERAL
USER
}
enum LogCategory {
HISTORY
SUMMARY
ACTION
BATTLE_BRIEF
BATTLE_DETAIL
USER
}
enum AuctionStatus {
OPEN
FINALIZING
FINISHED
CANCELED
@@map("auction_status")
}
enum AuctionType {
BUY_RICE
SELL_RICE
UNIQUE_ITEM
@@map("auction_type")
}
enum DiplomacyLetterState {
PROPOSED
ACTIVATED
CANCELLED
REPLACED
@@map("diplomacy_letter_state")
}
enum InputEventStatus {
PENDING
PROCESSING
SUCCEEDED
FAILED
}
enum InputEventTarget {
API
ENGINE
}
model InputEvent {
sequence BigInt @id @default(autoincrement())
requestId String @unique @map("request_id")
target InputEventTarget
eventType String @map("event_type")
payload Json @default(dbgenerated("'{}'::jsonb"))
actorUserId String? @map("actor_user_id")
status InputEventStatus @default(PENDING)
result Json?
error String?
attempts Int @default(0)
lockedBy String? @map("locked_by")
leaseUntil DateTime? @map("lease_until")
createdAt DateTime @default(now()) @map("created_at")
processingAt DateTime? @map("processing_at")
completedAt DateTime? @map("completed_at")
@@index([target, status, sequence])
@@map("input_event")
}
model ReadModelRevision {
domain String
entityId Int @default(0) @map("entity_id")
revision BigInt @default(0)
updatedAt DateTime @updatedAt @map("updated_at")
@@id([domain, entityId])
@@map("read_model_revision")
}
model ReadModelOutbox {
id BigInt @id @default(autoincrement())
payload Json
attempts Int @default(0)
availableAt DateTime @default(dbgenerated("CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")) @map("available_at") @db.Timestamp(3)
lockedAt DateTime? @map("locked_at") @db.Timestamp(3)
lockOwner String? @map("lock_owner")
deliveredAt DateTime? @map("delivered_at") @db.Timestamp(3)
lastError String? @map("last_error")
createdAt DateTime @default(dbgenerated("CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")) @map("created_at") @db.Timestamp(3)
@@index([deliveredAt, availableAt, id], map: "read_model_outbox_delivered_at_available_at_id_idx")
@@map("read_model_outbox")
}
model WebPushOutbox {
id BigInt @id @default(autoincrement())
eventId String @unique @map("event_id")
eventType String @map("event_type")
userIds String[] @default([]) @map("user_ids")
year Int?
month Int?
attempts Int @default(0)
availableAt DateTime @default(dbgenerated("CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")) @map("available_at") @db.Timestamp(3)
lockedAt DateTime? @map("locked_at") @db.Timestamp(3)
lockOwner String? @map("lock_owner")
deliveredAt DateTime? @map("delivered_at") @db.Timestamp(3)
lastError String? @map("last_error")
createdAt DateTime @default(dbgenerated("CURRENT_TIMESTAMP AT TIME ZONE 'UTC'")) @map("created_at") @db.Timestamp(3)
@@index([deliveredAt, availableAt, id], map: "web_push_outbox_delivered_at_available_at_id_idx")
@@map("web_push_outbox")
}
model ReadModelRevisionMeta {
id Int @id
coverageVersion Int @default(0) @map("coverage_version")
@@map("read_model_revision_meta")
}
model TurnDaemonLease {
profile String @id
ownerId String @map("owner_id")
leaseUntil DateTime @map("lease_until")
fencingEpoch BigInt @default(1) @map("fencing_epoch")
heartbeatAt DateTime @default(now()) @map("heartbeat_at")
@@map("turn_daemon_lease")
}
model WorldState {
id Int @id @default(autoincrement())
scenarioCode String @map("scenario_code")
currentYear Int @map("current_year")
currentMonth Int @map("current_month")
tickSeconds Int @map("tick_seconds")
clockBaseTime DateTime? @map("clock_base_time")
clockTick BigInt? @map("clock_tick")
clockMode String @default("realtime") @map("clock_mode")
clockWallAnchor DateTime? @map("clock_wall_anchor")
lastTurnTick BigInt? @map("last_turn_tick")
config Json @default(dbgenerated("'{}'::jsonb"))
meta Json @default(dbgenerated("'{}'::jsonb"))
updatedAt DateTime @updatedAt @map("updated_at")
trafficPeriods TrafficPeriod[]
@@map("world_state")
}
model Nation {
id Int @id
name String
color String
capitalCityId Int? @map("capital_city_id")
chiefGeneralId Int? @map("chief_general_id")
gold Int @default(0)
rice Int @default(0)
tech Float @default(0)
level Int @default(0)
typeCode String @default("che_중립") @map("type_code")
meta Json @default(dbgenerated("'{}'::jsonb"))
@@map("nation")
}
model City {
id Int @id
name String
level Int
nationId Int @default(0) @map("nation_id")
supplyState Int @default(1) @map("supply_state")
frontState Int @default(0) @map("front_state")
population Int @map("pop")
populationMax Int @map("pop_max")
agriculture Int @map("agri")
agricultureMax Int @map("agri_max")
commerce Int @map("comm")
commerceMax Int @map("comm_max")
security Int @map("secu")
securityMax Int @map("secu_max")
trust Float @default(0) @db.Real
trade Int? @default(100)
defence Int @map("def")
defenceMax Int @map("def_max")
wall Int @map("wall")
wallMax Int @map("wall_max")
region Int
conflict Json @default(dbgenerated("'{}'::jsonb"))
meta Json @default(dbgenerated("'{}'::jsonb"))
@@map("city")
}
model General {
id Int @id
userId String? @unique(map: "general_user_id_key") @map("user_id")
name String
nationId Int @default(0) @map("nation_id")
cityId Int @default(0) @map("city_id")
troopId Int @default(0) @map("troop_id")
npcState Int @default(0) @map("npc_state")
affinity Int?
bornYear Int @default(180) @map("born_year")
deadYear Int @default(300) @map("dead_year")
picture String?
imageServer Int @default(0) @map("image_server")
leadership Int @default(50)
strength Int @default(50)
intel Int @default(50)
injury Int @default(0)
experience Int @default(0)
dedication Int @default(0)
officerLevel Int @default(0) @map("officer_level")
gold Int @default(1000)
rice Int @default(1000)
crew Int @default(0)
crewTypeId Int @default(0) @map("crew_type_id")
train Int @default(0)
atmos Int @default(0)
weaponCode String @default("None") @map("weapon_code")
bookCode String @default("None") @map("book_code")
horseCode String @default("None") @map("horse_code")
itemCode String @default("None") @map("item_code")
turnTime DateTime @map("turn_time")
turnTick BigInt? @map("turn_tick")
recentWarTime DateTime? @map("recent_war_time")
recentWarTick BigInt? @map("recent_war_tick")
age Int @default(20)
startAge Int @default(20) @map("start_age")
personalCode String @default("None") @map("personal_code")
specialCode String @default("None") @map("special_code")
special2Code String @default("None") @map("special2_code")
lastTurn Json @default(dbgenerated("'{}'::jsonb")) @map("last_turn")
meta Json @default(dbgenerated("'{}'::jsonb"))
penalty Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @map("updated_at")
@@map("general")
}
model SelectPoolEntry {
id Int @id @default(autoincrement())
uniqueName String @unique @map("unique_name") @db.VarChar(20)
ownerUserId String? @map("owner_user_id")
generalId Int? @unique @map("general_id")
reservedUntil DateTime? @map("reserved_until")
reservedUntilTick BigInt? @map("reserved_until_tick")
info Json
@@index([ownerUserId])
@@index([reservedUntil, generalId])
@@map("select_pool")
}
model NpcSelectionToken {
ownerUserId String @id @map("owner_user_id")
validUntil DateTime @map("valid_until")
validUntilTick BigInt? @map("valid_until_tick")
pickMoreFrom DateTime @map("pick_more_from")
pickMoreFromTick BigInt? @map("pick_more_from_tick")
pickResult Json @map("pick_result")
nonce Int
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@index([validUntil])
@@map("select_npc_token")
}
model GeneralAccessLog {
id Int @id @default(autoincrement())
generalId Int @unique @map("general_id")
userId String? @map("user_id")
lastRefresh DateTime? @map("last_refresh")
lastActionAt DateTime? @map("last_action_at")
refresh Int @default(0)
refreshTotal Int @default(0) @map("refresh_total")
refreshScore Int @default(0) @map("refresh_score")
refreshScoreTotal Int @default(0) @map("refresh_score_total")
@@index([userId])
@@index([lastActionAt])
@@map("general_access_log")
}
model GeneralAccessBatch {
id String @id @db.VarChar(64)
createdAt DateTime @default(now()) @map("created_at")
@@index([createdAt])
@@map("general_access_batch")
}
model TrafficPeriod {
id Int @id @default(autoincrement())
worldStateId Int @map("world_state_id")
year Int
month Int
startedAt DateTime @map("started_at")
lastRefresh DateTime @map("last_refresh")
refresh Int @default(0)
online Int @default(0)
worldState WorldState @relation(fields: [worldStateId], references: [id], onDelete: Cascade)
generals TrafficPeriodGeneral[]
@@unique([worldStateId, year, month])
@@index([worldStateId, startedAt])
@@map("traffic_period")
}
model TrafficPeriodGeneral {
periodId Int @map("period_id")
generalId Int @map("general_id")
userId String? @map("user_id")
refresh Int @default(0)
lastRefresh DateTime @map("last_refresh")
period TrafficPeriod @relation(fields: [periodId], references: [id], onDelete: Cascade)
@@id([periodId, generalId])
@@index([periodId, refresh, generalId])
@@map("traffic_period_general")
}
model MessageReadState {
generalId Int @id @map("general_id")
latestPrivateMessage Int @default(0) @map("latest_private_message")
latestDiplomacyMessage Int @default(0) @map("latest_diplomacy_message")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("message_read_state")
}
model Message {
id Int @id @default(autoincrement())
mailbox Int
type String
src Int
dest Int
time DateTime
timeTick BigInt? @map("time_tick")
validUntil DateTime @map("valid_until")
validUntilTick BigInt? @map("valid_until_tick")
message Json
@@map("message")
}
model RankData {
id Int @id @default(autoincrement())
nationId Int @default(0) @map("nation_id")
generalId Int @map("general_id")
type String @db.VarChar(20)
value Int @default(0)
@@unique([generalId, type])
@@index([type, value], name: "by_type")
@@index([nationId, type, value], name: "by_nation")
@@map("rank_data")
}
model HallOfFame {
id Int @id @default(autoincrement())
serverId String @map("server_id")
season Int
scenario Int
generalNo Int @map("general_no")
type String @db.VarChar(20)
value Float
owner String? @map("owner")
aux Json @default(dbgenerated("'{}'::jsonb"))
@@unique([serverId, type, generalNo])
@@unique([owner, serverId, type], name: "hall_owner")
@@index([serverId, type, value], name: "server_show")
@@index([season, scenario, type, value], name: "scenario")
@@map("hall")
}
enum GameHistoryStatus {
OPEN
COMPLETED
ABANDONED
}
enum GameCancellationHistoryMode {
RETAIN_ABANDONED
DELETE
}
enum GameCancellationGeneralMode {
RETAIN
DELETE
}
model GameHistory {
id Int @id @default(autoincrement())
serverId String @map("server_id")
date DateTime
winnerNation Int? @map("winner_nation")
map String? @map("map")
season Int
scenario Int
scenarioName String @map("scenario_name")
status GameHistoryStatus @default(OPEN)
env Json @default(dbgenerated("'{}'::jsonb"))
@@unique([serverId])
@@index([date])
@@map("ng_games")
}
model GameInheritanceBaseline {
serverId String @map("server_id")
userId String @map("user_id")
openingPoint Float @map("opening_point")
source String @default("OPENING")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@id([serverId, userId])
@@index([userId, createdAt])
@@map("game_inheritance_baseline")
}
model GameCancellation {
id String @id
serverId String @unique @map("server_id")
originalSeason Int @map("original_season")
scenario Int
scenarioName String @map("scenario_name")
openedAt DateTime @map("opened_at")
cancelledAt DateTime @map("cancelled_at")
cancelledBy String @map("cancelled_by")
reason String
historyMode GameCancellationHistoryMode @map("history_mode")
generalMode GameCancellationGeneralMode @map("general_mode")
earnedPointRetentionPercent Int @map("earned_point_retention_percent")
participantCount Int @map("participant_count")
preservedGeneralCount Int @map("preserved_general_count")
settlement Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@index([cancelledAt])
@@map("game_cancellation")
}
model OldNation {
id Int @id @default(autoincrement())
serverId String @map("server_id")
nation Int @default(0)
sourceId Int @default(0) @map("source_id")
data Json @default(dbgenerated("'{}'::jsonb"))
date DateTime @default(now())
@@unique([serverId, nation, sourceId])
@@index([serverId, nation], name: "by_server")
@@map("ng_old_nations")
}
model OldGeneral {
id Int @id @default(autoincrement())
serverId String @map("server_id")
generalNo Int @map("general_no")
owner String? @map("owner")
name String
lastYearMonth Int @map("last_yearmonth")
turnTime DateTime @map("turntime")
data Json @default(dbgenerated("'{}'::jsonb"))
@@unique([serverId, generalNo], name: "by_no")
@@index([serverId, name], name: "by_name")
@@index([owner, serverId], name: "owner")
@@map("ng_old_generals")
}
model Emperor {
id Int @id @default(autoincrement()) @map("no")
legacyId Int? @unique @map("legacy_id")
serverId String? @map("server_id")
phase String? @default("")
nationCount String? @map("nation_count")
nationName String? @map("nation_name")
nationHist String? @map("nation_hist")
genCount String? @map("gen_count")
personalHist String? @map("personal_hist")
specialHist String? @map("special_hist")
name String? @default("")
type String? @default("")
color String? @default("")
year Int? @default(0)
month Int? @default(0)
power Int? @default(0)
gennum Int? @default(0)
citynum Int? @default(0)
pop String? @default("0")
poprate String? @default("")
gold Int? @default(0)
rice Int? @default(0)
l12name String? @default("")
l12pic String? @default("")
l11name String? @default("")
l11pic String? @default("")
l10name String? @default("")
l10pic String? @default("")
l9name String? @default("")
l9pic String? @default("")
l8name String? @default("")
l8pic String? @default("")
l7name String? @default("")
l7pic String? @default("")
l6name String? @default("")
l6pic String? @default("")
l5name String? @default("")
l5pic String? @default("")
tiger String? @default("")
eagle String? @default("")
gen String? @default("")
history Json @default(dbgenerated("'{}'::jsonb"))
aux Json @default(dbgenerated("'{}'::jsonb"))
@@map("emperior")
}
model UnificationFinalization {
generationKey String @id @map("generation_key")
serverId String @unique @map("server_id")
profileName String @map("profile_name")
winnerNation Int @map("winner_nation")
year Int
month Int
completedAt DateTime @map("completed_at")
createdAt DateTime @default(now()) @map("created_at")
@@map("unification_finalization")
}
model Troop {
troopLeaderId Int @id @map("troop_leader")
nationId Int @map("nation")
name String
@@map("troop")
}
model GeneralTurn {
id Int @id @default(autoincrement())
generalId Int @map("general_id")
turnIdx Int @map("turn_idx")
actionCode String @map("action_code")
arg Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@unique([generalId, turnIdx])
@@map("general_turn")
}
model GeneralTurnRevision {
generalId Int @id @map("general_id")
revision Int @default(0)
leaseOwner String? @map("lease_owner")
leaseExpiresAt DateTime? @map("lease_expires_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("general_turn_revision")
}
model NationTurn {
id Int @id @default(autoincrement())
nationId Int @map("nation_id")
officerLevel Int @map("officer_level")
turnIdx Int @map("turn_idx")
actionCode String @map("action_code")
arg Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@unique([nationId, officerLevel, turnIdx])
@@map("nation_turn")
}
model NationTurnRevision {
nationId Int @map("nation_id")
officerLevel Int @map("officer_level")
revision Int @default(0)
leaseOwner String? @map("lease_owner")
leaseExpiresAt DateTime? @map("lease_expires_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@id([nationId, officerLevel])
@@map("nation_turn_revision")
}
model Diplomacy {
id Int @id @default(autoincrement())
srcNationId Int @map("src_nation_id")
destNationId Int @map("dest_nation_id")
stateCode Int @map("state_code")
term Int @default(0)
isDead Boolean @default(false) @map("is_dead")
isShowing Boolean @default(true) @map("is_showing")
meta Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@unique([srcNationId, destNationId])
@@map("diplomacy")
}
model DiplomacyLetter {
id Int @id @default(autoincrement())
srcNationId Int @map("src_nation_id")
destNationId Int @map("dest_nation_id")
prevId Int? @map("prev_id")
state DiplomacyLetterState @default(PROPOSED)
textBrief String @map("text_brief")
textDetail String @map("text_detail")
date DateTime @default(now()) @map("date")
srcSignerId Int @map("src_signer")
destSignerId Int? @map("dest_signer")
aux Json @default(dbgenerated("'{}'::jsonb"))
@@index([srcNationId, destNationId])
@@index([destNationId, srcNationId])
@@index([state, date])
@@map("diplomacy_letter")
}
model YearbookHistory {
id Int @id @default(autoincrement())
profileName String @map("profile_name")
sourceId Int @default(0) @map("source_id")
year Int
month Int
map Json
nations Json
globalHistory Json @default(dbgenerated("'[]'::jsonb")) @map("global_history")
globalAction Json @default(dbgenerated("'[]'::jsonb")) @map("global_action")
hash String @default("")
createdAt DateTime @default(now()) @map("created_at")
@@unique([profileName, year, month, sourceId])
@@index([profileName, year, month])
@@map("yearbook_history")
}
model Event {
id Int @id @default(autoincrement())
targetCode String @map("target_code")
priority Int @default(0)
condition Json @default(dbgenerated("'{}'::jsonb"))
action Json @default(dbgenerated("'{}'::jsonb"))
meta Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@map("event")
}
model LogEntry {
id Int @id @default(autoincrement())
scope LogScope
category LogCategory
subType String? @map("sub_type")
year Int
month Int
text String
generalId Int? @map("general_id")
nationId Int? @map("nation_id")
userId Int? @map("user_id")
meta Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@index([scope, category, id])
@@index([generalId, category, id])
@@index([nationId, category, id])
@@index([userId, category, id])
@@map("log_entry")
}
model ErrorLog {
id Int @id @default(autoincrement())
category String
source String? @map("source")
message String
trace String?
context Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@index([category, id])
@@map("error_log")
}
model InheritancePoint {
id Int @id @default(autoincrement())
userId String @map("user_id")
key String
value Float @default(0)
aux Json @default(dbgenerated("'{}'::jsonb"))
updatedAt DateTime @updatedAt @map("updated_at")
@@unique([userId, key])
@@index([userId])
@@map("inheritance_point")
}
model NationBetting {
id Int @id
type String @default("bettingNation")
name String
finished Boolean @default(false)
selectCount Int @map("select_count")
isExclusive Boolean? @map("is_exclusive")
requiresInheritancePoint Boolean @default(true) @map("requires_inheritance_point")
openYearMonth Int @map("open_year_month")
closeYearMonth Int @map("close_year_month")
candidates Json
winner Json?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
bets NationBet[]
@@index([type, id])
@@map("nation_betting")
}
model NationBet {
id Int @id @default(autoincrement())
bettingId Int @map("betting_id")
generalId Int @map("general_id")
userId String? @map("user_id")
selection Json
selectionKey String @map("selection_key")
amount Float
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
betting NationBetting @relation(fields: [bettingId], references: [id], onDelete: Cascade)
@@unique([bettingId, userId, selectionKey])
@@index([bettingId])
@@index([bettingId, userId])
@@map("nation_bet")
}
model InheritanceLog {
id Int @id @default(autoincrement())
legacyId Int? @unique @map("legacy_id")
userId String @map("user_id")
serverId String? @map("server_id")
logType String @default("inheritPoint") @map("log_type")
year Int
month Int
text String
createdAt DateTime @default(now()) @map("created_at")
@@index([userId, id])
@@map("inheritance_log")
}
model InheritanceResult {
id Int @id @default(autoincrement())
legacyId Int? @unique @map("legacy_id")
serverId String @map("server_id")
owner String @map("owner")
generalId Int @map("general_id")
year Int
month Int
value Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
@@index([serverId, owner])
@@map("inheritance_result")
}
model Auction {
id Int @id @default(autoincrement())
type AuctionType
targetCode String? @map("target_code")
hostGeneralId Int @map("host_general_id")
hostName String? @map("host_name")
detail Json @default(dbgenerated("'{}'::jsonb"))
status AuctionStatus @default(OPEN)
closeAt DateTime @map("close_at")
openTick BigInt? @map("open_tick")
closeTick BigInt? @map("close_tick")
latestEventId String @default("") @map("latest_event_id")
latestEventAt DateTime @default(now()) @map("latest_event_at")
finalizingAt DateTime? @map("finalizing_at")
finishedAt DateTime? @map("finished_at")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
bids AuctionBid[]
@@index([status, closeAt])
@@map("auction")
}
model AuctionBid {
id Int @id @default(autoincrement())
auctionId Int @map("auction_id")
generalId Int @map("general_id")
amount Int
eventId String @map("event_id")
eventAt DateTime @map("event_at")
meta Json @default(dbgenerated("'{}'::jsonb"))
createdAt DateTime @default(now()) @map("created_at")
auction Auction @relation(fields: [auctionId], references: [id], onDelete: Cascade)
@@index([auctionId, amount])
@@index([auctionId, eventAt])
@@map("auction_bid")
}
model InheritanceUserState {
userId String @id @map("user_id")
meta Json @default(dbgenerated("'{}'::jsonb"))
updatedAt DateTime @updatedAt @map("updated_at")
@@map("inheritance_user_state")
}
model LegacyGameStorage {
id Int @id @default(autoincrement())
sourceId Int @map("source_id")
namespace String
key String
value Json
scope String
migratedAt DateTime @default(now()) @map("migrated_at")
@@unique([sourceId])
@@unique([namespace, key])
@@index([scope, namespace])
@@map("legacy_game_storage")
}
model BoardPost {
id Int @id @default(autoincrement())
nationId Int @map("nation_id")
isSecret Boolean @default(false) @map("is_secret")
authorGeneralId Int @map("author_general_id")
authorName String @map("author_name")
title String
contentHtml String @map("content_html")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
comments BoardComment[]
@@index([nationId, isSecret, createdAt])
@@map("board_post")
}
model BoardComment {
id Int @id @default(autoincrement())
postId Int @map("post_id")
nationId Int @map("nation_id")
isSecret Boolean @default(false) @map("is_secret")
authorGeneralId Int @map("author_general_id")
authorName String @map("author_name")
contentText String @map("content_text")
createdAt DateTime @default(now()) @map("created_at")
post BoardPost @relation(fields: [postId], references: [id], onDelete: Cascade)
@@index([postId, createdAt])
@@map("board_comment")
}
model VotePoll {
id Int @id @default(autoincrement())
title String
body String @default("")
options Json
multipleOptions Int @default(1) @map("multiple_options")
revealMode String @map("reveal_mode")
openerGeneralId Int @map("opener_general_id")
openerName String @map("opener_name")
startAt DateTime @default(now()) @map("start_at")
startTick BigInt? @map("start_tick")
endAt DateTime? @map("end_at")
endTick BigInt? @map("end_tick")
closedAt DateTime? @map("closed_at")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
votes Vote[]
comments VoteComment[]
@@map("vote_poll")
}
model Vote {
id Int @id @default(autoincrement())
voteId Int @map("vote_id")
generalId Int @map("general_id")
nationId Int @map("nation_id")
selection Json
createdAt DateTime @default(now()) @map("created_at")
poll VotePoll @relation(fields: [voteId], references: [id], onDelete: Cascade)
@@unique([voteId, generalId])
@@index([voteId])
@@map("vote")
}
model VoteComment {
id Int @id @default(autoincrement())
voteId Int @map("vote_id")
generalId Int @map("general_id")
nationId Int @map("nation_id")
generalName String @map("general_name")
nationName String @map("nation_name")
text String
createdAt DateTime @default(now()) @map("created_at")
poll VotePoll @relation(fields: [voteId], references: [id], onDelete: Cascade)
@@index([voteId, createdAt])
@@map("vote_comment")
}