enum MetadataSource { Manual GiantBomb PCGamingWiki IGDB } model Game { id String @id @default(uuid()) metadataSource MetadataSource metadataId String created DateTime @default(now()) // Any field prefixed with m is filled in from metadata // Acts as a cache so we can search and filter it mName String // Name of game mShortDescription String // Short description mDescription String // Supports markdown mReleased DateTime // When the game was released mReviewCount Int mReviewRating Float // 0 to 1 mIconObjectId String // linked to objects in s3 mBannerObjectId String // linked to objects in s3 mCoverObjectId String mImageCarouselObjectIds String[] // linked to below array mImageLibraryObjectIds String[] // linked to objects in s3 versions GameVersion[] libraryBasePath String @unique // Base dir for all the game versions collections CollectionEntry[] saves SaveSlot[] screenshots Screenshot[] tags Tag[] developers Company[] @relation(name: "developers") publishers Company[] @relation(name: "publishers") @@unique([metadataSource, metadataId], name: "metadataKey") } // A particular set of files that relate to the version model GameVersion { gameId String game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) versionName String // Sub directory for the game files created DateTime @default(now()) platform Platform launchCommand String @default("") // Command to run to start. Platform-specific. Windows games on Linux will wrap this command in Proton/Wine launchArgs String[] setupCommand String @default("") // Command to setup game (dependencies and such) setupArgs String[] onlySetup Boolean @default(false) umuIdOverride String? dropletManifest Json // Results from droplet versionIndex Int delta Boolean @default(false) @@id([gameId, versionName]) } // 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 @default(true) createdAt DateTime @default(now()) @db.Timestamptz(0) @@index([gameId, userId]) } model Company { id String @id @default(uuid()) metadataSource MetadataSource metadataId String metadataOriginalQuery String mName String mShortDescription String mDescription String mLogoObjectId String mBannerObjectId String mWebsite String developed Game[] @relation(name: "developers") published Game[] @relation(name: "publishers") @@unique([metadataSource, metadataId], name: "metadataKey") } model ObjectHash { id String @id hash String }