generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model User { id Int @id @default(autoincrement()) username String @unique passwordHash String balance BigInt @default(0) osuBalance Int @default(0) prBalance Int @default(0) lastAdAt DateTime? role String @default("user") avatarUrl String @default("") bio String @default("") autoSellEnabled Boolean @default(false) autoSellThresholdCents BigInt @default(1000) prestigeCount Int @default(0) prestigeChanceBonus Int @default(0) prestigeGainBonus Int @default(0) prestigeKeyOpenReduction Int @default(0) prestigeStartBonus Int @default(0) prestigeAdBonus Int @default(0) prestigeAdCooldownReduction Int @default(0) prestigeWearBonus Int @default(0) prestigePrBonus Int @default(0) prestigeShopDiscount Int @default(0) prestigeStartOsu Int @default(0) prestigeDropValueBonus Int @default(0) prestigeOpenBonus Int @default(0) prestigeCaseDiscount Int @default(0) prestigeQualityBonus Int @default(0) prestigeAnimReduction Int @default(0) prestigeRefundChance Int @default(0) prestigeRespinChance Int @default(0) prestigeVaultSlots Int @default(0) prestigeOfflineYield Int @default(0) prestigeOnlineYield Int @default(0) lastConnection DateTime? playTimeSeconds BigInt @default(0) createdAt DateTime @default(now()) inventory InventoryItem[] transactions Transaction[] jackpotWins JackpotRound[] @relation("JackpotWinner") jackpotDeposits JackpotDeposit[] duelRoomsCreated DuelRoom[] @relation("DuelCreator") duelWins DuelRoom[] @relation("DuelWinner") duelDeposits DuelDeposit[] caseKeyProgress CaseKeyProgress[] catalogEntries CatalogEntry[] prestigeLogs PrestigeLog[] achievements UserAchievement[] } model Case { id Int @id @default(autoincrement()) name String imageUrl String @default("") price BigInt active Boolean @default(true) createdAt DateTime @default(now()) items CaseItem[] keyProgress CaseKeyProgress[] catalogEntries CatalogEntry[] } model Category { id Int @id @default(autoincrement()) name String @unique createdAt DateTime @default(now()) } model Item { id Int @id @default(autoincrement()) name String imageUrl String @default("") rarity String category String @default("Misc") marketValue BigInt createdAt DateTime @default(now()) cases CaseItem[] inventory InventoryItem[] catalogEntries CatalogEntry[] } model CaseItem { id Int @id @default(autoincrement()) caseId Int itemId Int dropRate Float case Case @relation(fields: [caseId], references: [id], onDelete: Cascade) item Item @relation(fields: [itemId], references: [id], onDelete: Cascade) @@unique([caseId, itemId]) } model InventoryItem { id Int @id @default(autoincrement()) userId Int itemId Int locked Boolean @default(false) staked Boolean @default(false) stakedAt DateTime? lastYieldAt DateTime? floatValue Float @default(0.265) wear String @default("Field-Tested") paintSeed Int @default(0) valueCents BigInt @default(0) favorite Boolean @default(false) obtainedAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) item Item @relation(fields: [itemId], references: [id], onDelete: Cascade) jackpotDeposits JackpotDeposit[] duelDeposits DuelDeposit[] } model Transaction { id Int @id @default(autoincrement()) userId Int type String amount BigInt meta String @default("{}") createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model JackpotRound { id Int @id @default(autoincrement()) status String @default("open") endsAt DateTime winnerUserId Int? createdAt DateTime @default(now()) resolvedAt DateTime? winner User? @relation("JackpotWinner", fields: [winnerUserId], references: [id]) deposits JackpotDeposit[] } model JackpotDeposit { id Int @id @default(autoincrement()) roundId Int userId Int inventoryItemId Int valueCents BigInt createdAt DateTime @default(now()) round JackpotRound @relation(fields: [roundId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) inventoryItem InventoryItem @relation(fields: [inventoryItemId], references: [id], onDelete: Cascade) @@unique([roundId, inventoryItemId]) } model DuelRoom { id Int @id @default(autoincrement()) creatorId Int status String @default("open") maxPlayers Int maxItemsPerPlayer Int minItemValue BigInt @default(0) minPlayersToStart Int @default(2) winnerUserId Int? createdAt DateTime @default(now()) startedAt DateTime? resolvedAt DateTime? creator User @relation("DuelCreator", fields: [creatorId], references: [id], onDelete: Cascade) winner User? @relation("DuelWinner", fields: [winnerUserId], references: [id]) deposits DuelDeposit[] } model DuelDeposit { id Int @id @default(autoincrement()) roomId Int userId Int inventoryItemId Int valueCents BigInt createdAt DateTime @default(now()) room DuelRoom @relation(fields: [roomId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) inventoryItem InventoryItem @relation(fields: [inventoryItemId], references: [id], onDelete: Cascade) @@unique([roomId, inventoryItemId]) } model CaseKeyProgress { id Int @id @default(autoincrement()) userId Int caseId Int keys Int @default(1) opensSinceLastKey Int @default(0) totalOpens Int @default(0) user User @relation(fields: [userId], references: [id], onDelete: Cascade) case Case @relation(fields: [caseId], references: [id], onDelete: Cascade) @@unique([userId, caseId]) } model CatalogEntry { id Int @id @default(autoincrement()) userId Int caseId Int itemId Int filledAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) case Case @relation(fields: [caseId], references: [id], onDelete: Cascade) item Item @relation(fields: [itemId], references: [id], onDelete: Cascade) @@unique([userId, caseId, itemId]) } model PrestigeLog { id Int @id @default(autoincrement()) userId Int choice String prGranted Int @default(0) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Achievement { id Int @id @default(autoincrement()) key String @unique name String description String icon String @default("") sortOrder Int @default(0) createdAt DateTime @default(now()) unlocks UserAchievement[] } model UserAchievement { id Int @id @default(autoincrement()) userId Int achievementId Int unlockedAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) achievement Achievement @relation(fields: [achievementId], references: [id], onDelete: Cascade) @@unique([userId, achievementId]) }