Files
msgapp/prisma/schema.prisma

163 lines
3.9 KiB
Plaintext
Raw Normal View History

2025-10-08 23:04:12 +09:00
// 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")
}
2025-10-08 23:44:21 +09:00
// 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 모델 예시 ----
2025-10-08 23:04:12 +09:00
model User {
2025-10-08 23:44:21 +09:00
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])
2025-10-08 23:04:12 +09:00
}
2025-10-08 23:44:21 +09:00
model Comment {
id String @id @default(cuid())
postId String
authorId String?
2025-10-08 23:04:12 +09:00
content String
2025-10-08 23:44:21 +09:00
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])
2025-10-08 23:04:12 +09:00
}