db 정의중
This commit is contained in:
@@ -10,19 +10,153 @@ datasource db {
|
|||||||
url = env("DATABASE_URL")
|
url = env("DATABASE_URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
model User {
|
// schema.prisma (MySQL)
|
||||||
id Int @id @default(autoincrement())
|
|
||||||
email String @unique
|
// ==== Enums ====
|
||||||
name String?
|
enum BoardStatus {
|
||||||
messages Message[]
|
active
|
||||||
createdAt DateTime @default(now())
|
hidden
|
||||||
updatedAt DateTime @updatedAt
|
archived
|
||||||
}
|
}
|
||||||
|
|
||||||
model Message {
|
enum AccessLevel {
|
||||||
id Int @id @default(autoincrement())
|
public // 비회원도 접근
|
||||||
content String
|
member // 로그인 필요
|
||||||
createdAt DateTime @default(now())
|
moderator // 운영진 이상
|
||||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
admin // 관리자만
|
||||||
userId Int
|
}
|
||||||
|
|
||||||
|
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])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,17 +3,52 @@ const { PrismaClient } = require("@prisma/client");
|
|||||||
const prisma = new PrismaClient();
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
await prisma.user.upsert({
|
const user = await prisma.user.upsert({
|
||||||
where: { email: "test@example.com" },
|
where: { nickname: "tester" },
|
||||||
update: {},
|
update: {},
|
||||||
create: {
|
create: {
|
||||||
email: "test@example.com",
|
nickname: "tester",
|
||||||
name: "Tester",
|
name: "Tester",
|
||||||
messages: {
|
birth: new Date("1990-01-01"),
|
||||||
create: [{ content: "Hello world" }, { content: "Second message" }]
|
phone: "010-0000-0000",
|
||||||
}
|
agreementTermsAt: new Date()
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const board = await prisma.board.upsert({
|
||||||
|
where: { slug: "general" },
|
||||||
|
update: {},
|
||||||
|
create: {
|
||||||
|
name: "General",
|
||||||
|
slug: "general",
|
||||||
|
description: "일반 게시판",
|
||||||
|
sortOrder: 0
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const post = await prisma.post.create({
|
||||||
|
data: {
|
||||||
|
boardId: board.id,
|
||||||
|
authorId: user.userId,
|
||||||
|
title: "첫 글",
|
||||||
|
content: "Hello SQLite + Prisma",
|
||||||
|
isPinned: false,
|
||||||
|
status: "published"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await prisma.boardModerator.upsert({
|
||||||
|
where: { boardId_userId: { boardId: board.id, userId: user.userId } },
|
||||||
|
update: {},
|
||||||
|
create: { boardId: board.id, userId: user.userId, role: "MODERATOR" }
|
||||||
|
});
|
||||||
|
|
||||||
|
await prisma.comment.createMany({
|
||||||
|
data: [
|
||||||
|
{ postId: post.id, authorId: user.userId, content: "첫 댓글" },
|
||||||
|
{ postId: post.id, authorId: user.userId, content: "두번째 댓글" }
|
||||||
|
]
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user