Kord/prisma/schema.prisma

175 lines
4.1 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
}
model GuildConfig {
guildId String @id
prefix String @default("!")
mimicEnabled Boolean @default(false)
bigEmojiEnabled Boolean @default(false)
locale String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model InviteRole {
id String @id @default(uuid())
guildId String
inviteCode String
roleId String
createdAt DateTime @default(now())
@@unique([guildId, inviteCode])
}
model UserSubscription {
userId String @id
tier SubscriptionTier @default(FREE)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
guilds GuildOwnership[]
}
model GuildOwnership {
guildId String @id
ownerId String
createdAt DateTime @default(now())
owner UserSubscription @relation(fields: [ownerId], references: [userId], onDelete: Cascade)
@@index([ownerId])
}
model VoiceGenerator {
channelId String @id
guildId String
categoryId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([guildId])
}
model TempVoiceChannel {
channelId String @id
guildId String
ownerId String
deleteWhen DeleteCondition @default(EMPTY)
createdAt DateTime @default(now())
@@index([guildId])
@@index([ownerId])
}
model UserVoiceProfile {
userId String
guildId String
customName String?
userLimit Int?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@id([userId, guildId])
}
model UserLocale {
userId String @id
locale String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum SubscriptionTier {
FREE
STANDARD
PRO
PREMIUM
}
enum DeleteCondition {
OWNER_LEAVE
EMPTY
}
model AuditChannel {
guildId String @id
channelId String
disabledCategories String[] @default(["BOOT", "SYSTEM"])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model VoiceGuildConfig {
guildId String @id
defaultNameTemplate String @default("{{username}}'s Room")
defaultUserLimit Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
// ─── Mini Game System ───────────────────────────────────────────────────────
// 서버별 미니게임 활성화 상태 관리
model MiniGameConfig {
id String @id @default(uuid())
guildId String
gameKey String
enabled Boolean @default(false)
channelId String?
updatedAt DateTime @updatedAt
@@unique([guildId, gameKey])
@@index([guildId])
}
// 재련 - 유저 상태
model RefinementProfile {
userId String
guildId String
gold Int @default(1000)
weaponLevel Int @default(0)
maxWeaponLevel Int @default(0)
durability Int @default(10)
tryCount Int @default(0)
successCount Int @default(0)
failCount Int @default(0)
destroyCount Int @default(0)
battleWin Int @default(0)
battleLoss Int @default(0)
dailyBattleCount Int @default(0)
lastBattleReset DateTime @default(now())
isDisabled Boolean @default(false)
lastCheckIn DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@id([userId, guildId])
@@index([guildId, weaponLevel(sort: Desc)])
}
// 서버 활동 추이 (시간대별 메시지 수)
model ActivityLog {
id String @id @default(uuid())
guildId String
hour Int
dayOfWeek Int
count Int @default(0)
weekStart DateTime
@@unique([guildId, hour, dayOfWeek, weekStart])
@@index([guildId, weekStart])
}
// 피버 상태
model FeverState {
guildId String @id
isActive Boolean @default(false)
peakHour Int?
bonusRate Float @default(0.1)
expiresAt DateTime?
updatedAt DateTime @updatedAt
}