generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } enum Nation { WATER EARTH FIRE AIR } enum UserStatus { ACTIVE SUSPENDED } enum TxType { DEPOSIT WITHDRAW GAME_BET GAME_WIN ADJUST } enum TxStatus { COMPLETED PENDING FAILED CANCELLED } enum GameSlug { SLOTS BLACKJACK ROULETTE BACCARAT CRASH } model User { id String @id @default(cuid()) email String @unique username String @unique passwordHash String nation Nation? isAvatar Boolean @default(false) avatarAt DateTime? points Int @default(0) status UserStatus @default(ACTIVE) lastLoginAt DateTime? loginStreak Int @default(0) lastLoginDay String? createdAt DateTime @default(now()) wallet Wallet? transactions Transaction[] rounds GameRound[] badges UserBadge[] progress UserProgress[] withdrawals WithdrawalRequest[] kyc KycSubmission? } model Wallet { id String @id @default(cuid()) userId String @unique balanceCents Int @default(0) lockedCents Int @default(0) totalDepositCents Int @default(0) totalWithdrawCents Int @default(0) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Transaction { id String @id @default(cuid()) userId String type TxType amountCents Int balanceAfterCents Int status TxStatus @default(COMPLETED) refId String? meta String? createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId, createdAt]) } model GameRound { id String @id @default(cuid()) userId String game GameSlug betCents Int resultCents Int state String @default("{}") status String @default("COMPLETED") createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId, createdAt]) } model Badge { id String @id @default(cuid()) code String @unique nation Nation tier Int title String description String icon String metric String target Int hidden Boolean @default(false) userBadges UserBadge[] @@index([nation]) } model UserBadge { id String @id @default(cuid()) userId String badgeId String earnedAt DateTime @default(now()) progress Int @default(0) user User @relation(fields: [userId], references: [id], onDelete: Cascade) badge Badge @relation(fields: [badgeId], references: [id], onDelete: Cascade) @@unique([userId, badgeId]) } model UserProgress { id String @id @default(cuid()) userId String metric String value Int @default(0) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, metric]) } model WithdrawalRequest { id String @id @default(cuid()) userId String amountCents Int method String account String status String @default("PENDING") createdAt DateTime @default(now()) processedAt DateTime? user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model KycSubmission { id String @id @default(cuid()) userId String @unique docType String status String @default("PENDING") submittedAt DateTime @default(now()) verifiedAt DateTime? user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model AdminUser { id String @id @default(cuid()) username String @unique passwordHash String role String @default("admin") createdAt DateTime @default(now()) } model SiteSetting { key String @id value String }