BAT-006 (REQ-016/017/018): - client token 발급 경로 제거 (issue_client_token, POST /auth/tokens, 관련 스키마/테스트) - service-token rotate unique index revoked_at IS NULL 조건 추가 (Alembic CONCURRENTLY 마이그레이션) - POST /auth/service-tokens body daemon_id forward 누락 보정 (1-line fix) BAT-007 (REQ-022/023): - daemon deactivate 시 바인딩 service token 자동 revoke (CLI --force 옵션 + revoke_tokens_by_daemon_id) - NULL daemon_id legacy token 진단 CLI (migrate-null-daemon --dry-run) 거버넌스 문서: dcy-003/004 Discovery, REQ-016~023/025~032 신규, BAT-006/007 전체 산출물 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.9 KiB
2.9 KiB
BAT-007 Implementation
- Status: completed
- Batch: BAT-007
Plan Summary
- REQ-022: revoke_tokens_by_daemon_id repository + revoke_tokens_for_daemon service + daemon CLI 연결
- REQ-023: list_service_tokens_with_null_daemon repository + 서비스 헬퍼 + migrate_null_daemon CLI
Changed Files
Production Code
app/repositories/portfolio_repository.py— 추상 메서드 2개 추가:revoke_tokens_by_daemon_id,list_service_tokens_with_null_daemonapp/repositories/postgres.py— 위 2개 메서드 Postgres 구현 추가app/services/auth_service.py— 서비스 메서드 3개 추가:revoke_tokens_for_daemon,list_null_daemon_service_tokens,find_candidate_daemons_for_userapp/cli/commands/daemon.py—update_daemon커맨드에--force옵션 + deactivate 시 service token 자동 revoke 연결app/cli/commands/service_tokens.py—migrate-null-daemon커맨드 추가 (dry-run only)
Tests
tests/test_daemon_registry.py—_DaemonRepofake에revoke_tokens_by_daemon_id/list_service_tokens_with_null_daemon추가; REQ-022 테스트 5건 추가tests/test_null_daemon_migration.py— 신규 파일; REQ-023 AC-1~5 + candidate daemon 출력 테스트 6건
Execution Log
portfolio_repository.py: 추상 메서드 2개 추가postgres.py:revoke_tokens_by_daemon_id—UPDATE auth_tokens SET revoked_at=NOW() WHERE daemon_id=%s AND revoked_at IS NULL;list_service_tokens_with_null_daemon—WHERE token_type='service' AND daemon_id IS NULL AND revoked_at IS NULL ORDER BY created_at ASCauth_service.py: 3개 메서드 위임 구현daemon.py:--force/--deactivate/--activate옵션 추가; deactivate 경로에서repo.revoke_tokens_by_daemon_id(daemon_id)호출 후 revoke 건수 출력service_tokens.py:migrate-null-daemon커맨드 —--dry-run없으면 즉시 exit(1) + 수동 안내;--dry-run시 NULL daemon token 목록 + user별 candidate daemon ID 출력test_daemon_registry.py:_DaemonRepofake 확장; 5개 테스트 추가test_null_daemon_migration.py:_FakeRepo+create_app(repository_factory=...)패턴으로 CLI runner 구성; 6개 테스트 추가- 수정 사항:
_make_runner에서obj=ctx_obj전달 방식은 Typermain_callback이ctx.obj를 덮어쓰므로create_app(repository_factory=...)방식으로 교체
Validation
.venv/bin/python -m pytest -q
266 passed in 7.86s
- BAT-007 대상 테스트: 25개 (test_daemon_registry.py 19, test_null_daemon_migration.py 6) — 전부 PASSED
- 전체 회귀: 266 passed, 0 failed
Remaining Risks
- Postgres 구현은 단위 테스트(fake repo) 기반 검증; PostgreSQL DB 통합 테스트는 별도 환경 필요
--deactivate시 revoke는 CLI 단계에서 수행 — API 경로에서 daemon deactivate가 발생할 경우 revoke 호출 별도 필요 (현재 API 경로 없음, 향후 추가 시 고려)