model UserPlatform { id String @id @default(uuid()) redistId String? @unique redist Redist? @relation(fields: [redistId], references: [id], onDelete: Cascade, onUpdate: Cascade) platformName String iconSvg String fileExtensions String[] @default([]) versions Version[] } model Version { versionId String @id @unique @default(uuid()) versionPath String versionName String created DateTime @default(now()) gameId String? game Game? @relation(fields: [gameId], references: [id], map: "game_link", onDelete: Cascade, onUpdate: Cascade) gameVersion GameVersion? redistId String? redist Redist? @relation(fields: [redistId], references: [id], map: "redist_link", onDelete: Cascade, onUpdate: Cascade) redistVersion RedistVersion? dlcId String? dlc DLC? @relation(fields: [dlcId], references: [id], map: "dlc_link", onDelete: Cascade, onUpdate: Cascade) dlcVersion DLCVersion? modId String? mod Mod? @relation(fields: [modId], references: [id], map: "mod_link", onDelete: Cascade, onUpdate: Cascade) modVersion ModVersion? platform Platform? userPlatformRedistId String? userPlatform UserPlatform? @relation(fields: [userPlatformRedistId], references: [redistId]) dropletManifest Json // Results from droplet } model GameVersion { versionId String @id version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) redistDeps RedistVersion[] launches LaunchOption[] setupCommand String @default("") setupArgs String @default("") onlySetup Boolean @default(false) umuIdOverride String? versionIndex Int delta Boolean @default(false) hidden Boolean @default(false) } model LaunchOption { launchId String @id @default(uuid()) versionId String gameVersion GameVersion? @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade, map: "gameVersion_fkey") redistVersion RedistVersion? @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade, map: "redistVersion_fkey") name String description String launchCommand String launchArgs String @default("") } model DLCVersion { versionId String @id version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) redistDeps RedistVersion[] } model RedistVersion { versionId String @id version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) launches LaunchOption[] gameDependees GameVersion[] dlcDependees DLCVersion[] } model ModVersion { versionId String @id version Version @relation(fields: [versionId], references: [versionId], onDelete: Cascade, onUpdate: Cascade) dependencies String[] } // A save slot for a game model SaveSlot { gameId String game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) index Int createdAt DateTime @default(now()) playtime Float @default(0) // hours lastUsedClientId String? lastUsedClient Client? @relation(fields: [lastUsedClientId], references: [id]) historyObjectIds String[] // list of objects historyChecksums String[] // list of hashes @@id([gameId, userId, index], name: "id") } model Screenshot { id String @id @default(uuid()) gameId String game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) objectId String private Boolean // if other users can see createdAt DateTime @default(now()) @db.Timestamptz(0) @@index([gameId, userId]) @@index([userId]) } model Playtime { gameId String game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) seconds Int // seconds user has spent playing the game updatedAt DateTime @updatedAt @db.Timestamptz(6) createdAt DateTime @default(now()) @db.Timestamptz(6) @@id([gameId, userId]) @@index([userId]) } model ObjectHash { id String @id hash String }