105 lines
3.0 KiB
Markdown
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별 태스크 필터
|