168 lines
4.0 KiB
Plaintext
168 lines
4.0 KiB
Plaintext
// 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"
|
|
}
|
|
|
|
generator erd {
|
|
provider = "prisma-erd-generator"
|
|
output = "../public/erd.svg"
|
|
}
|
|
|
|
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])
|
|
}
|