dcy-003/004 기반 v1 API surface 완성 및 BAT-008~011 구현·검증 완료:
- BAT-008 (REQ-019~021,024): 토큰 surface baseline 문서 갱신
- BAT-009 (REQ-025~028): POST/PATCH/DELETE/GET /v1/portfolios CRUD 신설
- _require_write_token, _get_portfolio_or_404, soft delete, daemon-scoped list
- BAT-010 (REQ-030~032): portfolio tag/comment 서브 라우트 신설 + baseline 갱신
- GET/POST/DELETE /v1/portfolios/{id}/tags
- POST/GET/PATCH/DELETE /v1/portfolios/{id}/comments
- BAT-011 (REQ-029): ledger path migration
- POST /v1/assets/{asset_id}/ledger/trades → /v1/portfolios/{portfolio_id}/ledger/trades
- v1_ledger.py 제거, disabled 차단(409) 추가
- test_v1.py / test_daemon_assignment.py 구 path 갱신
- 신규 tests: test_v1_portfolios_crud.py, test_v1_portfolios_list.py,
test_v1_portfolios_tags_comments.py, test_v1_portfolios_ledger.py
- 전체 suite: 340 passed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
BAT-011 Implementation
- Status: done
- Batch: BAT-011
Plan Summary
app/api/v1_portfolios.py에POST /{portfolio_id}/ledger/trades추가 (daemon 인가 3단계 + disabled 차단 + idempotency).app/api/v1_ledger.py제거 +app/main.pyinclude 정리.tests/test_v1_portfolios_ledger.py신규 (AC-1~10).tests/test_v1.py구 path 케이스 갱신 + HTTP 404 회귀 확인.
Changed Files
app/api/v1_portfolios.py—POST /{portfolio_id}/ledger/trades라우트 신설;_require_service_token의존성(service token + daemon_id IS NULL 검증);_payloads_match헬퍼;LedgerTradeRequest/Responseimport 추가app/api/v1_ledger.py— 삭제 (구 path 라우트 완전 제거)app/main.py—v1_ledger_routerimport 및app.include_router(v1_ledger_router)제거tests/test_v1_portfolios_ledger.py— 신규 (AC-1~10: 10 tests)tests/test_v1.py— 구 path 케이스 5건 신 path 갱신;app.api.v1_ledger.*패치 →app.api.v1_portfolios.*갱신; 파일 말미 중복 helper 2건 제거tests/test_daemon_assignment.py—app.api.v1_ledger.*패치 →app.api.v1_portfolios.*갱신; URL 4건 갱신;_portfolio_with_daemon에p.status = "enabled"추가
Execution Log
app/api/v1_portfolios.py—Responseimport 추가,LedgerTradeRequest/LedgerTradeResponseimport 추가_require_service_token의존성 추가 (service token 검증 + daemon_id IS NULL 403)_payloads_match헬퍼 추가 (idempotency conflict 판정)POST /{portfolio_id}/ledger/trades라우트 추가 (disabled 409 → managed_by_daemon_id NULL 403 → daemon mismatch 403 → insert_ledger_trade)app/api/v1_ledger.py삭제app/main.py에서 v1_ledger 라우터 import + include 제거tests/test_v1.py— 구 path URL 및 패치 경로 갱신 + 중복 helper 제거tests/test_daemon_assignment.py— URL 및 패치 경로 갱신;_portfolio_with_daemonstatus명시tests/test_v1_portfolios_ledger.py— 신규 생성 (AC-1~10)
Validation
pytest tests/test_v1_portfolios_ledger.py -v: 10 passedpytest --tb=short -q(full suite): 340 passed, 0 failed (2 warnings, non-blocking)
Remaining Risks
- R-1 (High): trex-basic 동시 배포 — release 단계 배포 순서 잠금 필수 (trex-basic 사전 빌드 완료 확인 → portfolio-hub 배포 → trex-basic 배포).