# 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별 태스크 필터