generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // ── Enums ────────────────────────────────────────────────────────────────────── enum UserRole { user dev com } enum BugSeverity { low medium high critical } enum BugStatus { open in_progress resolved closed } enum EventType { announcement update milestone poll } // ── Users ────────────────────────────────────────────────────────────────────── model User { id String @id @default(cuid()) username String @unique email String @unique password String role UserRole @default(user) isAdmin Boolean @default(false) isBanned Boolean @default(false) avatarUrl String? createdAt DateTime @default(now()) // Relations forumThreads ForumThread[] forumReplies ForumReply[] bugReports BugReport[] @relation("SubmittedBugs") assignedBugs BugReport[] @relation("AssignedBugs") bugComments BugComment[] bugNotes BugReportNote[] meTooBugs MeTooBug[] staffPosts StaffPost[] eventPosts EventPost[] pollVotes PollVote[] } // ── Forum ────────────────────────────────────────────────────────────────────── model ForumCategory { id String @id @default(cuid()) name String description String icon String createdAt DateTime @default(now()) threads ForumThread[] } model ForumThread { id String @id @default(cuid()) title String content String isPinned Boolean @default(false) isLocked Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt authorId String author User @relation(fields: [authorId], references: [id]) categoryId String category ForumCategory @relation(fields: [categoryId], references: [id]) replies ForumReply[] } model ForumReply { id String @id @default(cuid()) content String createdAt DateTime @default(now()) authorId String author User @relation(fields: [authorId], references: [id]) threadId String thread ForumThread @relation(fields: [threadId], references: [id], onDelete: Cascade) } // ── Bug Reports ──────────────────────────────────────────────────────────────── model BugReport { id String @id @default(cuid()) uniqueCode String @unique title String description String stepsToReproduce String severity BugSeverity gameVersion String screenshotUrl String? status BugStatus @default(open) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt submittedById String submittedBy User @relation("SubmittedBugs", fields: [submittedById], references: [id]) assignedToId String? assignedTo User? @relation("AssignedBugs", fields: [assignedToId], references: [id]) comments BugComment[] notes BugReportNote[] meTooBugs MeTooBug[] } model BugComment { id String @id @default(cuid()) content String createdAt DateTime @default(now()) bugReportId String bugReport BugReport @relation(fields: [bugReportId], references: [id], onDelete: Cascade) authorId String author User @relation(fields: [authorId], references: [id]) } model BugReportNote { id String @id @default(cuid()) content String createdAt DateTime @default(now()) bugReportId String bugReport BugReport @relation(fields: [bugReportId], references: [id], onDelete: Cascade) authorId String author User @relation(fields: [authorId], references: [id]) } model MeTooBug { userId String bugReportId String user User @relation(fields: [userId], references: [id]) bugReport BugReport @relation(fields: [bugReportId], references: [id], onDelete: Cascade) @@id([userId, bugReportId]) } // ── Staff Feed ───────────────────────────────────────────────────────────────── model StaffPost { id String @id @default(cuid()) content String createdAt DateTime @default(now()) authorId String author User @relation(fields: [authorId], references: [id]) } // ── Events & Polls ───────────────────────────────────────────────────────────── model EventPost { id String @id @default(cuid()) type EventType title String content String isPublic Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt authorId String author User @relation(fields: [authorId], references: [id]) poll Poll? } model Poll { id String @id @default(cuid()) question String isActive Boolean @default(true) endsAt DateTime? allowMultipleVotes Boolean @default(false) createdAt DateTime @default(now()) eventId String @unique event EventPost @relation(fields: [eventId], references: [id], onDelete: Cascade) options PollOption[] } model PollOption { id String @id @default(cuid()) text String pollId String poll Poll @relation(fields: [pollId], references: [id], onDelete: Cascade) votes PollVote[] } model PollVote { userId String pollOptionId String user User @relation(fields: [userId], references: [id]) pollOption PollOption @relation(fields: [pollOptionId], references: [id], onDelete: Cascade) @@id([userId, pollOptionId]) } // ── Site Settings ────────────────────────────────────────────────────────────── model SiteSettings { id Int @id @default(1) forumEnabled Boolean @default(true) bugsEnabled Boolean @default(true) } // ── Team Members ─────────────────────────────────────────────────────────────── model TeamMember { id String @id @default(cuid()) name String role String bio String? avatarInitials String twitterHandle String? githubHandle String? }