// =======================
// DATABASE & GENERATOR
// =======================
datasource db {
provider = "postgresql" // PostgreSQL 사용
url = env("DATABASE_URL") // 환경변수에서 DB 주소 불러옴
}
generator client {
provider = "prisma-client-js" // Prisma Client 생성
}
// ======================================================
// User (회원)
// - 서비스의 모든 기준이 되는 최상위 엔티티
// - 로그인/회원정보/포인트/알림/주문/교환에 모두 연결됨
// ======================================================
model User {
id String @id @default(cuid())
/// PK — 회원 고유 ID (Prisma cuid 자동 생성)
email String @unique
/// 회원 이메일 (로그인 아이디), 중복 불가
password String
/// 비밀번호 해시값 저장 (bcrypt 등으로 암호화하여 저장)
nickname String
/// 닉네임 (서비스 내 표시 이름)
points Int? @default(0)
/// 보유 포인트 (판매 성공, 구매 취소, 이벤트 등에 사용 가능)
refreshToken String?
/// JWT Refresh Token — 자동로그인 유지용 (옵션)
createdAt DateTime @default(now())
/// 회원 가입일 / 계정 생성일
// -----------------------
// Relations
// -----------------------
card Card[]
/// 사용자가 보유 중이고 등록한 모든 카드(상품)
purchases Order[] @relation("Purchaser")
/// 구매자로 참여한 모든 주문(Order)
sales Order[] @relation("Seller")
/// 판매자로 참여한 모든 주문(Order)
exchanges Exchange[]
/// 자신이 요청한 모든 교환 기록
history History[]
/// 활동 알림 / 기록
}
// ======================================================
// Card (포토카드 + 판매물)
// - 사용자 소유 카드이자 동시에 상품(판매 등록 가능)
// - 하나의 Card가 모든 흐름의 중심 (판매/교환/구매)
// ======================================================
model Card {
id String @id @default(cuid())
/// PK — 카드 고유 ID
ownerId String
owner User @relation(fields: [ownerId], references: [id])
/// FK — 해당 카드를 소유한 사용자
name String
/// 카드명 / 상품명 (예: 정국 포카, 카리나 셀카)
imageUrl String
/// 카드 이미지 URL
description String
/// 카드 상세 설명 (상태, 특징, 흠집 여부 등)
genre String
/// 그룹 / 카테고리 (예: BTS / NEWJEANS / IVE)
grade String
/// 카드 등급 (예: S, A, B / 혹은 Normal, Rare 등)
point Int
/// 판매 또는 교환 시 기준 포인트(가격 개념)
status CardStatus @default(OWNED)
/// 카드의 현재 상태 (소유 / 판매중 / 예약중 / 판매됨 / 교환 제시중)
createdAt DateTime @default(now())
/// 카드 등록일
// -----------------------
// Relations
// -----------------------
orders Order[]
/// 해당 카드를 기반으로 발생한 모든 주문(구매/판매 기록)
exchanges Exchange[]
/// 해당 카드를 기준으로 요청된 교환 기록
}
// 카드 상태 ENUM
enum CardStatus {
OWNED // 소유중
LISTED // 판매 등록됨
RESERVED // 거래 예약됨
SOLD // 판매됨
EXCHANGE // 교환 제시중
}
// ======================================================
// Order (구매/판매)
// - Card를 기반으로 만들어지는 실제 거래 정보
// - buyer, seller, card 모두 연결됨
// ======================================================
model Order {
id String @id @default(cuid())
/// PK — 주문 고유 ID
cardId String
card Card @relation(fields: [cardId], references: [id])
/// FK — 어떤 카드를 거래하는가
buyerId String
buyer User @relation("Purchaser", fields: [buyerId], references: [id])
/// FK — 구매자
sellerId String
seller User @relation("Seller", fields: [sellerId], references: [id])
/// FK — 판매자 (= 카드 owner)
status OrderStatus @default(PENDING)
/// 주문 상태 (대기 → 성공/실패 → 완료)
paymentMethod String?
/// 결제 방식 (카드결제, 포인트결제 등)
failureReason String?
/// 결제 실패 시 사유 설명
createdAt DateTime @default(now())
/// 주문 생성일
updatedAt DateTime @updatedAt
/// 주문 정보 변경 시 자동 업데이트
}
// 주문 상태 ENUM
enum OrderStatus {
PENDING // 결제 대기 중
PAID // 결제 성공
FAILED // 결제 실패
REFUNDED // 환불됨
COMPLETED // 구매 완료
}
// ======================================================
// Exchange (교환 요청)
// - 특정 사용자가 특정 카드에 대해 교환을 요청하는 기록
// ======================================================
model Exchange {
id String @id @default(cuid())
/// PK — 교환 요청 ID
requesterId String
requester User @relation(fields: [requesterId], references: [id])
/// FK — 교환 요청자
cardId String
card Card @relation(fields: [cardId], references: [id])
/// FK — 교환 요청의 대상이 되는 카드
status ExchangeStatus @default(PENDING)
/// 교환 상태 (대기 → 수락/거절 → 완료)
message String?
/// 교환 요청 시 전달하는 메시지 (옵션)
createdAt DateTime @default(now())
/// 요청 생성일
updatedAt DateTime @updatedAt
/// 상태 변경 등 정보 업데이트
}
// 교환 상태 ENUM
enum ExchangeStatus {
PENDING
ACCEPTED
REJECTED
COMPLETED
}
// ======================================================
// History (알림 / 사용자 활동 기록)
// ======================================================
model History {
id String @id @default(cuid())
/// PK — 기록 고유 ID
userId String
user User @relation(fields: [userId], references: [id])
/// FK — 알림을 받는 사용자
message String
/// 알림 내용 (예: “판매 등록 완료”, “교환 요청 받음”)
isRead Boolean @default(false)
/// 읽음 여부 (false = 안 읽음)
createdAt DateTime @default(now())
/// 기록 생성일
}