generator client { provider = "prisma-client" output = "../src/generated/prisma" } datasource db { provider = "postgresql" } model Admin { id String @id @default(cuid()) username String @unique passwordHash String createdAt DateTime @default(now()) } model Addon { id String @id @default(cuid()) name String nameEn String @default("") slug String @unique summary String summaryEn String @default("") description String @db.Text descriptionEn String @default("") @db.Text iconUrl String? category String @default("general") published Boolean @default(false) totalDownloads Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt releases Release[] screenshots Screenshot[] @@index([published, totalDownloads]) @@index([category]) } model Release { id String @id @default(cuid()) addonId String version String changelog String @db.Text changelogEn String @default("") @db.Text downloadType String @default("local") filePath String? externalUrl String? gameVersion String @default("") // Turtle WoW client major version this build targets. Only "1.18" is active. wowVersion String @default("1.18") downloadCount Int @default(0) isLatest Boolean @default(false) createdAt DateTime @default(now()) addon Addon @relation(fields: [addonId], references: [id], onDelete: Cascade) @@index([addonId]) @@index([addonId, wowVersion, isLatest]) } model Screenshot { id String @id @default(cuid()) addonId String imageUrl String sortOrder Int @default(0) addon Addon @relation(fields: [addonId], references: [id], onDelete: Cascade) @@index([addonId]) } model Software { id String @id @default(cuid()) name String nameEn String @default("") slug String @unique description String @default("") descriptionEn String @default("") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt versions SoftwareVersion[] } model SoftwareVersion { id String @id @default(cuid()) softwareId String version String versionCode Int changelog String @db.Text changelogEn String @default("") @db.Text downloadType String @default("local") filePath String? externalUrl String? fileSize Int @default(0) downloadCount Int @default(0) launcherDownloadCount Int @default(0) isLatest Boolean @default(false) forceUpdate Boolean @default(false) minVersion String? // Turtle WoW client major version this build targets. Only "1.18" is active. wowVersion String @default("1.18") createdAt DateTime @default(now()) software Software @relation(fields: [softwareId], references: [id], onDelete: Cascade) @@unique([softwareId, version, wowVersion]) @@index([softwareId]) @@index([softwareId, wowVersion, isLatest]) } model BannerImage { id String @id @default(cuid()) imageUrl String sortOrder Int @default(0) enabled Boolean @default(true) createdAt DateTime @default(now()) } model GalleryImage { id String @id @default(cuid()) imageUrl String title String @default("") titleEn String @default("") sortOrder Int @default(0) enabled Boolean @default(true) createdAt DateTime @default(now()) } model Article { id String @id @default(cuid()) title String titleEn String @default("") slug String @unique summary String @default("") summaryEn String @default("") content String @db.Text contentEn String @default("") @db.Text coverImage String? published Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([published, createdAt]) } model PageView { id String @id @default(cuid()) path String referrer String @default("") userAgent String @default("") ip String @default("") date String createdAt DateTime @default(now()) @@index([date]) @@index([path]) } model LauncherOnline { id String @id @default(cuid()) deviceId String @unique ip String @default("") os String @default("") osVersion String @default("") appVersion String @default("") lastSeen DateTime @default(now()) createdAt DateTime @default(now()) @@index([lastSeen]) } model SiteSetting { id Int @id @default(1) grayscale Boolean @default(false) shutdownBannerEnabled Boolean @default(false) shutdownTitle String @default("") shutdownTitleEn String @default("") shutdownSubtitle String @default("") shutdownSubtitleEn String @default("") shutdownAt DateTime? bgmUrl String @default("") bgmAutoplay Boolean @default(false) bgmVolume Int @default(50) updatedAt DateTime @updatedAt }