250 lines
7.9 KiB
Plaintext
250 lines
7.9 KiB
Plaintext
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 String @default("0")
|
|
osuBalance Int @default(0)
|
|
prBalance String @default("0")
|
|
lastAdAt DateTime?
|
|
role String @default("user")
|
|
avatarUrl String @default("")
|
|
bio String @default("")
|
|
autoSellEnabled Boolean @default(false)
|
|
autoSellThresholdCents String @default("1000")
|
|
prestigeCount Int @default(0)
|
|
prestigeChanceBonus Int @default(0)
|
|
prestigeGainBonus Int @default(0)
|
|
prestigeWearBonus Int @default(0)
|
|
prestigePrBonus Int @default(0)
|
|
prestigeOpenBonus 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)
|
|
vaultYieldAt DateTime?
|
|
lastConnection DateTime?
|
|
playTimeSeconds BigInt @default(0)
|
|
createdAt DateTime @default(now())
|
|
inventory InventoryItem[]
|
|
transactions Transaction[]
|
|
jackpotWins JackpotRound[] @relation("JackpotWinner")
|
|
jackpotCreated JackpotRound[] @relation("JackpotCreator")
|
|
jackpotDeposits JackpotDeposit[]
|
|
caseKeyProgress CaseKeyProgress[]
|
|
catalogEntries CatalogEntry[]
|
|
prestigeLogs PrestigeLog[]
|
|
achievements UserAchievement[]
|
|
paymentOrders PaymentOrder[]
|
|
}
|
|
|
|
model PaymentOrder {
|
|
id String @id @default(cuid())
|
|
userId Int
|
|
packId String
|
|
osuAmount Int
|
|
priceCents Int
|
|
currency String @default("eur")
|
|
status String @default("pending")
|
|
provider String @default("mock")
|
|
providerRef String @default("")
|
|
meta String @default("{}")
|
|
createdAt DateTime @default(now())
|
|
paidAt DateTime?
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([userId, status])
|
|
@@index([providerRef])
|
|
}
|
|
|
|
model Case {
|
|
id Int @id @default(autoincrement())
|
|
name String
|
|
imageUrl String @default("")
|
|
price String @default("0")
|
|
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 String @default("0")
|
|
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 String @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[]
|
|
}
|
|
|
|
model Transaction {
|
|
id Int @id @default(autoincrement())
|
|
userId Int
|
|
type String
|
|
amount String
|
|
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
|
|
creatorId Int?
|
|
winnerUserId Int?
|
|
createdAt DateTime @default(now())
|
|
resolvedAt DateTime?
|
|
creator User? @relation("JackpotCreator", fields: [creatorId], references: [id])
|
|
winner User? @relation("JackpotWinner", fields: [winnerUserId], references: [id])
|
|
deposits JackpotDeposit[]
|
|
|
|
@@index([status])
|
|
}
|
|
|
|
model JackpotDeposit {
|
|
id Int @id @default(autoincrement())
|
|
roundId Int
|
|
userId Int
|
|
inventoryItemId Int
|
|
valueCents String
|
|
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 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 String @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])
|
|
}
|
|
|
|
/** Key/value app settings (e.g. shop.osuTopupsEnabled). */
|
|
model AppSetting {
|
|
key String @id
|
|
value String
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
/** Configurable real-money → osu packs for the shop. */
|
|
model ShopOsuPack {
|
|
id String @id
|
|
name String
|
|
osu Int
|
|
priceCents Int
|
|
currency String @default("eur")
|
|
badge String @default("")
|
|
blurb String @default("")
|
|
perOsuLabel String @default("")
|
|
enabled Boolean @default(true)
|
|
sortOrder Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|