# task-602.1: FastAPI groupchat API 엔드포인트 추가

> 작성: 라(Ra) 개발3팀장 | 2026-03-15 | 검증 레벨: normal

---

## SCQA

**S**: 대시보드가 FastAPI 모드로 운영 중이며, groupchat 데이터를 조회하는 3개의 GET 엔드포인트와 1개의 POST 엔드포인트가 SimpleHTTP 핸들러에만 구현되어 있었다.

**C**: FastAPI 라우트가 없어 `/api/groupchat/summaries`, `/api/groupchat/insights`, `/api/groupchat/messages`, `/api/groupchat/organize` 4개 엔드포인트가 모두 404를 반환하고 있었다. 대시보드 집단지성 탭 전체가 동작 불가 상태.

**Q**: FastAPI 모드에서 groupchat 4개 엔드포인트를 정상 동작시킬 수 있는가?

**A**: `server.py` 라인 1980~2020에 FastAPI 라우트 4개를 추가하여 해결. GLM이 생성한 코드에서 whisper-status SimpleHTTP 핸들러의 `self.server.data_loader` 타입 버그를 `self.data_loader`로 수정 후 pyright 0건 달성. pytest 51건 전체 통과, black/isort 준수.

---

## 구현 내용

### 추가된 FastAPI 라우트 (4개, server.py 라인 1980~2020)

| 엔드포인트 | 메서드 | 위임 대상 |
|---|---|---|
| `/api/groupchat/summaries` | GET | `DashboardHandler._get_groupchat_summaries(date)` |
| `/api/groupchat/insights` | GET | `DashboardHandler._get_groupchat_insights(date)` |
| `/api/groupchat/messages` | GET | `DashboardHandler._get_groupchat_messages(date, limit)` |
| `/api/groupchat/organize` | POST | trigger 파일 생성 (`events/dashboard-organize-trigger.json`) |

### 구현 패턴
`DashboardHandler.__new__(DashboardHandler)` + `handler.data_loader = self.data_loader` 패턴으로 기존 SimpleHTTP 메서드 재사용. 기존 FastAPI 라우트와 동일한 스타일.

---

## 발견 이슈 및 해결

### 자체 해결 (1건)

1. **whisper-status SimpleHTTP 핸들러의 `self.server.data_loader` 타입 버그** — `self.data_loader`로 수정
   - 상세: `server.py:1046` — GLM이 새로 추가한 whisper-status SimpleHTTP 핸들러에서 `self.server.data_loader` 사용. `DashboardHandler`는 클래스 변수 `data_loader`를 직접 참조해야 하므로 `self.data_loader`로 수정. pyright: 1 error → 0 errors.

### 범위 외 미해결 (0건)

---

## QC 체크리스트

- [x] **스펙 전수 체크**: 4개 FastAPI 라우트 모두 추가 완료 (summaries, insights, messages, organize)
- [x] **테스트 작성**: `tests/test_groupchat_api.py` 10개 테스트케이스 존재 및 전체 통과
- [x] **black/isort 포맷**: PASS (변경 없음 확인)
- [x] **pyright 에러 0건**: 0 errors, 0 warnings (라 팀장 수정 후 달성)
- [x] **기존 테스트 회귀 없음**: 51 passed in 0.30s (전체 통과)
- [x] **이슈 자체 해결**: whisper-status 버그 직접 수정

---

## 검증 증거

```
pytest: 51 passed in 0.30s
pyright server.py: 0 errors, 0 warnings, 0 informations
black --check server.py: All done! 1 file would be left unchanged.
isort --check server.py: 통과
```

---

## QC 자동검증 결과 (qc_verify.py)

```json
{
  "task_id": "task-602.1",
  "verified_at": "2026-03-15T21:10:02",
  "overall": "FAIL",
  "checks": {
    "api_health": {"status": "SKIP"},
    "file_check": {"status": "FAIL", "details": ["NO .done FILE: /home/jay/workspace/memory/events/task-602.1.done (아직 미생성 - 정상)"]},
    "data_integrity": {"status": "PASS"},
    "test_runner": {"status": "PASS", "details": ["51 passed in 0.30s"]},
    "tdd_check": {"status": "PASS"},
    "pyright_check": {"status": "WARN", "details": ["test 파일 sys.path.insert import WARN - 런타임 정상, pyright 해석 한계"]},
    "style_check": {"status": "PASS"},
    "summary": "5 PASS, 1 FAIL, 3 SKIP, 1 WARN"
  }
}
```

> `file_check` FAIL: finish-task.sh 실행 전 검증 시점 차이로 .done 미존재. 현재 `.done` 생성 완료.
> `pyright_check` WARN: 테스트 파일의 `sys.path.insert` 패턴 — pyright이 런타임 path 조작을 추적 불가. 테스트는 정상 통과.

---

## 생성/수정 파일

- `수정`: `/home/jay/workspace/dashboard/server.py` (FastAPI 4개 라우트 추가, whisper-status 버그 수정)
- `확인`: `/home/jay/workspace/dashboard/tests/test_groupchat_api.py` (GLM 생성, 10개 테스트)

## 소요 시간

5분 50초 (2026-03-15 21:04 ~ 21:10)
