# SPRINT-007: Gitea 연동 + 활동 로그 실시간화 ## 목표 프로젝트 데이터를 Gitea 기반으로 전환 + 활동 로그 자동 기록 ## 태스크 ### TASK-024: Gitea 동기화 API - GiteaService 강화 (기존 optional 패턴 유지) - API 엔드포인트: - `POST /api/admin/gitea/sync` — Gitea org의 전체 repo를 DB에 동기화 - `GET /api/projects` — DB에서 프로젝트 목록 (Gitea 데이터 포함) - 동기화 로직: - Gitea API `/api/v1/orgs/hanarang/repos` 호출 - 각 repo → Project 테이블 upsert (giteaId, name, repoUrl, description) - 마지막 동기화 시간 기록 - 자동 동기화: EventsScheduler에서 5분마다 폴링 (선택) ### TASK-025: Commit/Branch/PR 조회 API - API 엔드포인트: - `GET /api/projects/:id/commits` — 최근 커밋 목록 (Gitea API `/repos/:owner/:repo/commits`) - `GET /api/projects/:id/branches` — 브랜치 목록 - `GET /api/projects/:id/pulls` — PR 목록 (open/closed) - 응답 포맷: 커밋 해시, 메시지, 작성자, 날짜 / 브랜치명, 최신 커밋 / PR 제목, 상태 - 에러 핸들링: Gitea 연결 실패 시 graceful fallback ### TASK-026: 프로젝트 페이지 FE (Gitea 데이터) - `/projects` 목록 페이지: - DB 프로젝트 목록 표시 (이름, 설명, 상태, repo URL) - 동기화 버튼 (관리자) - `/projects/[id]` 상세 페이지: - 탭: Overview / Commits / Branches / PRs - Commits: 커밋 히스토리 테이블 (해시, 메시지, 작성자, 날짜) - Branches: 브랜치 카드 목록 - PRs: PR 리스트 (상태 태그: open/merged/closed) - 디자인: DESIGN-SYSTEM.md v2 준수 (project-detail-design.md 확장) - 로딩: 스켈레톤 UI ### TASK-027: 활동 로그 자동 기록 - ActivityLog 모델 활용 (기존 테이블 사용) - 자동 기록 트리거: - 자매 상태 변경 시 (online ↔ offline) - Gitea 동기화 시 (새 repo/커밋 감지) - 관리자 액션 시 (재시작, 하네스 편집, 설정 변경) - ActivityService에 `logActivity()` 메서드 추가 → 각 서비스에서 호출 - WebSocket으로 실시간 푸시 (`activity:new` 이벤트 활용) - `/activities` 페이지: 실제 ActivityLog 데이터 표시 (하드코딩 제거) - 필터/검색/페이지네이션 실제 동작 ## 의존성 - Sprint 006 완료 필요 (JWT 인증) - TASK-024 → TASK-025 (repo가 DB에 있어야 commit 조회 가능) - TASK-026은 TASK-025 완료 후 연동 - TASK-027은 독립적 (다른 태스크와 병렬 가능) ## 검증 기준 - Gitea 동기화 → DB에 프로젝트 생성 확인 - 커밋/브랜치/PR 조회 정상 동작 - 활동 로그 자동 기록 + WebSocket 실시간 푸시 - /activities 페이지에서 실제 데이터 표시 (필터/페이지네이션 동작) - npm run build 성공 + 테스트 통과