173 lines
4.0 KiB
Plaintext
173 lines
4.0 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)
|
|
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
|
|
}
|