// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } // schema.prisma (MySQL) // ==== Enums ==== enum BoardStatus { active hidden archived } enum AccessLevel { public // 비회원도 접근 member // 로그인 필요 moderator // 운영진 이상 admin // 관리자만 } enum PostStatus { published hidden deleted } enum BoardModRole { MODERATOR MANAGER } enum UserStatus { active suspended withdrawn } enum AuthLevel { USER MOD ADMIN } // ==== Models ==== // 게시판 정의(관리자 생성/정렬) model Board { id String @id @default(cuid()) name String slug String @unique // URL용 description String? sortOrder Int @default(0) // 원하는 순서 status BoardStatus @default(active) isAdultOnly Boolean @default(false) // 성인 인증 필요 여부 readLevel AccessLevel @default(public) // 읽기 권한 writeLevel AccessLevel @default(member) // 글쓰기 권한 posts Post[] moderators BoardModerator[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("boards") @@index([status, sortOrder]) } // 게시판 운영진 매핑 model BoardModerator { id String @id @default(cuid()) boardId String userId String role BoardModRole @default(MODERATOR) board Board @relation(fields: [boardId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [userId], onDelete: Cascade) createdAt DateTime @default(now()) @@map("board_moderators") @@unique([boardId, userId]) // 한 게시판당 1회 매핑 @@index([userId]) } // 게시글(게시판 내 컨텐츠) model Post { id String @id @default(cuid()) boardId String authorId String? title String content String status PostStatus @default(published) isPinned Boolean @default(false) pinnedOrder Int? // 상단 고정 정렬 createdAt DateTime @default(now()) updatedAt DateTime @updatedAt lastActivityAt DateTime @default(now()) board Board @relation(fields: [boardId], references: [id], onDelete: Cascade) author User? @relation(fields: [authorId], references: [userId], onDelete: SetNull) comments Comment[] @@map("posts") @@index([boardId, status, createdAt]) @@index([boardId, isPinned, pinnedOrder]) } // ---- 참고: 기존 User 모델 예시 ---- model User { userId String @id @default(cuid()) nickname String @unique passwordHash String? name String birth DateTime phone String @unique rank Int @default(0) status UserStatus @default(active) authLevel AuthLevel @default(USER) profileImage String? lastLoginAt DateTime? isAdultVerified Boolean @default(false) loginFailCount Int @default(0) agreementTermsAt DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt posts Post[] boardModerations BoardModerator[] comments Comment[] @@map("users") @@index([status]) @@index([createdAt]) } model Comment { id String @id @default(cuid()) postId String authorId String? content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt post Post @relation(fields: [postId], references: [id], onDelete: Cascade) author User? @relation(fields: [authorId], references: [userId], onDelete: SetNull) @@map("comments") @@index([postId, createdAt]) }