Files
hanarang-dashboard/.plans/design/db-schema.md

105 lines
3.0 KiB
Markdown

# DB 스키마
## 개요
대시보드 자체 데이터 저장용. 자매 상태/프로젝트 정보는 SSH + Gitea API에서 실시간 수집하므로,
DB에는 캐시/이력/설정 데이터만 저장한다.
## Prisma 모델
### SisterConfig (자매 설정 캐시)
```prisma
model SisterConfig {
id Int @id @default(autoincrement())
name String @unique // harang, narang, darang, erang
ip String
user String
lxcId Int
sshKeyPath String? // SSH 키 경로
lastSeen DateTime? // 마지막 온라인 시각
status String @default("unknown") // online, offline, working, unknown
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
activityLogs ActivityLog[]
}
```
### Project (프로젝트 캐시)
```prisma
model Project {
id Int @id @default(autoincrement())
giteaId Int @unique // Gitea repo ID
name String
repoUrl String
description String?
status String @default("active") // active, completed, archived
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sprints Sprint[]
activityLogs ActivityLog[]
}
```
### Sprint
```prisma
model Sprint {
id Int @id @default(autoincrement())
projectId Int
project Project @relation(fields: [projectId], references: [id])
number Int // 1, 2, 3...
name String // "Sprint 001 — 세팅"
status String @default("pending") // pending, in_progress, review, done, failed
startedAt DateTime?
completedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tasks Task[]
}
```
### Task (Task Ledger)
```prisma
model Task {
id Int @id @default(autoincrement())
sprintId Int
sprint Sprint @relation(fields: [sprintId], references: [id])
taskId String // "TASK-001"
title String
assignee String // harang, narang, darang, erang
status String @default("pending") // pending, in_progress, review, done, failed, blocked, escalated
iteration Int @default(0) // Maker-Checker 반복 횟수
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
```
### ActivityLog (활동 이력)
```prisma
model ActivityLog {
id Int @id @default(autoincrement())
sisterId Int?
sister SisterConfig? @relation(fields: [sisterId], references: [id])
projectId Int?
project Project? @relation(fields: [projectId], references: [id])
action String // "handoff", "review_pass", "review_fail", "deploy", "restart" 등
detail String? // 상세 내용
createdAt DateTime @default(now())
}
```
## ERD
```
SisterConfig (1) ──→ (N) ActivityLog
Project (1) ──→ (N) Sprint (1) ──→ (N) Task
Project (1) ──→ (N) ActivityLog
```
## 인덱스 참고
- `SisterConfig.name` → unique
- `Project.giteaId` → unique
- `ActivityLog.createdAt` → 최신순 조회 빈번
- `Task.sprintId + status` → Sprint별 태스크 필터