db 정의중

This commit is contained in:
koreacomp5
2025-10-08 23:44:21 +09:00
parent 39b5592c7d
commit 45cc1c0271
2 changed files with 188 additions and 19 deletions

View File

@@ -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])
} }

View File

@@ -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()