generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Guild { id String @id createdAt DateTime @default(now()) updatedAt DateTime @updatedAt settings GuildSettings? cases Case[] escalationRules EscalationRule[] autoModConfig AutoModConfig? autoModRules AutoModRule[] loggingConfig LoggingConfig? logChannels LogChannel[] welcomeConfig WelcomeConfig? verificationConfig VerificationConfig? levelingConfig LevelingConfig? memberLevels MemberLevel[] levelRewards LevelReward[] economyConfig EconomyConfig? memberEconomies MemberEconomy[] shopItems ShopItem[] inventoryItems InventoryItem[] polls Poll[] reminders Reminder[] afkStatuses AfkStatus[] } model GuildSettings { id String @id @default(cuid()) guildId String @unique locale String @default("de") moderationEnabled Boolean @default(true) guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model User { id String @id createdAt DateTime @default(now()) warnings Warning[] notes ModNote[] } model Case { id String @id @default(cuid()) caseNumber Int guildId String targetUserId String moderatorId String action String reason String? metadata Json? deletedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) warnings Warning[] moderationNote ModNote[] @@unique([guildId, caseNumber]) @@index([guildId, targetUserId]) } model Warning { id String @id @default(cuid()) guildId String userId String moderatorId String reason String? caseId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) case Case? @relation(fields: [caseId], references: [id], onDelete: SetNull) @@index([guildId, userId]) } model ModNote { id String @id @default(cuid()) guildId String userId String moderatorId String note String caseId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) case Case? @relation(fields: [caseId], references: [id], onDelete: SetNull) @@index([guildId, userId]) } model EscalationRule { id String @id @default(cuid()) guildId String warnCount Int action String durationMs Int? reason String? enabled Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, warnCount]) @@index([guildId, enabled]) } model AutoModConfig { id String @id @default(cuid()) guildId String @unique enabled Boolean @default(true) antiRaidEnabled Boolean @default(false) antiRaidJoinThreshold Int @default(10) antiRaidWindowSeconds Int @default(10) antiRaidAction String @default("LOCKDOWN") antiNukeEnabled Boolean @default(false) antiNukeBanThreshold Int @default(5) antiNukeChannelThreshold Int @default(3) antiNukeWindowSeconds Int @default(60) lockdownActive Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model AutoModRule { id String @id @default(cuid()) guildId String ruleType String enabled Boolean @default(true) action String @default("DELETE") threshold Json? exceptions Json? wordList Json? durationMs Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, ruleType]) @@index([guildId, enabled]) } model LoggingConfig { id String @id @default(cuid()) guildId String @unique enabled Boolean @default(true) ignoreBots Boolean @default(true) ignoredChannelIds String[] @default([]) ignoredRoleIds String[] @default([]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model LogChannel { id String @id @default(cuid()) guildId String eventType String channelId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, eventType]) @@index([guildId]) } model WelcomeConfig { id String @id @default(cuid()) guildId String @unique welcomeEnabled Boolean @default(false) leaveEnabled Boolean @default(false) welcomeChannelId String? leaveChannelId String? welcomeType String @default("TEXT") welcomeContent String? welcomeEmbed Json? leaveContent String? leaveEmbed Json? welcomeDmEnabled Boolean @default(false) welcomeDmContent String? userAutoroleIds String[] @default([]) botAutoroleIds String[] @default([]) imageTitle String? imageSubtitle String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model VerificationConfig { id String @id @default(cuid()) guildId String @unique enabled Boolean @default(false) channelId String? verifiedRoleId String? unverifiedRoleId String? mode String @default("BUTTON") minAccountAgeDays Int @default(0) failAction String @default("KICK") panelChannelId String? panelMessageId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model LevelingConfig { id String @id @default(cuid()) guildId String @unique enabled Boolean @default(true) textXpMin Int @default(15) textXpMax Int @default(25) textCooldownSeconds Int @default(60) voiceXpPerMinute Int @default(10) noXpChannelIds String[] @default([]) noXpRoleIds String[] @default([]) roleMultipliers Json? channelMultipliers Json? levelUpMode String @default("CHANNEL") levelUpChannelId String? levelUpMessage String? stackRewards Boolean @default(true) cardAccentColor String @default("#6366F1") cardBackgroundColor String @default("#111827") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model MemberLevel { id String @id @default(cuid()) guildId String userId String xp Int @default(0) level Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, userId]) @@index([guildId, xp]) } model LevelReward { id String @id @default(cuid()) guildId String level Int roleId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, level]) @@index([guildId]) } model EconomyConfig { id String @id @default(cuid()) guildId String @unique enabled Boolean @default(true) currencyName String @default("Coins") currencySymbol String @default("🪙") dailyAmount Int @default(200) weeklyAmount Int @default(1000) workMin Int @default(50) workMax Int @default(150) workCooldownSeconds Int @default(3600) startingBalance Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) } model MemberEconomy { id String @id @default(cuid()) guildId String userId String balance Int @default(0) lastDailyAt DateTime? lastWeeklyAt DateTime? lastWorkAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, userId]) @@index([guildId, balance]) } model ShopItem { id String @id @default(cuid()) guildId String name String description String? price Int roleId String? stock Int? enabled Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) inventory InventoryItem[] @@index([guildId, enabled]) } model InventoryItem { id String @id @default(cuid()) guildId String userId String itemId String quantity Int @default(1) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) item ShopItem @relation(fields: [itemId], references: [id], onDelete: Cascade) @@unique([guildId, userId, itemId]) @@index([guildId, userId]) } model Poll { id String @id @default(cuid()) guildId String channelId String messageId String? creatorId String question String options Json multiSelect Boolean @default(false) anonymous Boolean @default(false) endsAt DateTime? closedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) votes PollVote[] @@index([guildId]) } model PollVote { id String @id @default(cuid()) pollId String userId String optionIndex Int createdAt DateTime @default(now()) poll Poll @relation(fields: [pollId], references: [id], onDelete: Cascade) @@unique([pollId, userId, optionIndex]) @@index([pollId]) } model Reminder { id String @id @default(cuid()) guildId String? userId String channelId String content String remindAt DateTime recurringCron String? jobId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild? @relation(fields: [guildId], references: [id], onDelete: Cascade) @@index([userId]) @@index([remindAt]) } model AfkStatus { id String @id @default(cuid()) guildId String userId String reason String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt guild Guild @relation(fields: [guildId], references: [id], onDelete: Cascade) @@unique([guildId, userId]) }