# BAT-002 Implementation - Status: verified - Batch: BAT-002 ## Plan Summary - 이번 구현에서 실제 변경할 범위: 1. `app/schemas/v1.py` — AssetCatalogCreateRequest, AssetCatalogUpdateRequest, AssetCatalogResponse 추가 2. `app/api/v1_assets.py` — admin 엔드포인트 3개 추가(REQ-010) + list_assets 토큰 분기 재작성(REQ-013) 3. `app/cli/commands/asset.py` (신규) — pfhub asset create/list/update/deactivate 4. `app/cli/main.py` — asset_app 등록 5. `app/services/portfolio_service.py` — create_portfolio catalog 검증 추가(REQ-012) 6. `app/cli/commands/portfolio.py` — create --symbol 옵션 추가(REQ-012) 7. `app/repositories/portfolio_repository.py` — list_portfolios/list_portfolios_with_strategies market 파라미터 추가 8. `app/repositories/postgres.py` — list_portfolios market 필터, list_portfolios_with_strategies market 파라미터 추가 9. `docs/` 4종 갱신(REQ-015) 10. 테스트 파일 갱신 및 신규 ## Changed Files - `app/schemas/v1.py` — AssetCatalogCreateRequest, AssetCatalogUpdateRequest, AssetCatalogResponse 추가 - `app/api/v1_assets.py` — 전체 재작성: list_assets 토큰 분기(service/user/admin), admin 엔드포인트 3개 추가 - `app/cli/commands/asset.py` (신규) — pfhub asset create/list/update/deactivate typer 커맨드 - `app/cli/main.py` — asset_app 등록 - `app/services/portfolio_service.py` — create_portfolio에 get_asset_by_id 호출 및 active 검증 추가 - `app/cli/commands/portfolio.py` — create 커맨드에 --symbol 옵션 추가 - `app/repositories/portfolio_repository.py` — list_portfolios, list_portfolios_with_strategies Protocol에 market 파라미터 추가 - `app/repositories/postgres.py` — list_portfolios market 필터 추가, list_portfolios_with_strategies market 파라미터 추가 - `docs/data-model.md` — Asset 엔티티 추가, Portfolio asset_id FK 반영 - `docs/interface-contract.md` — POST/PATCH /v1/assets 신규, GET /v1/assets 토큰 분기 명세 갱신 - `docs/runtime-flows.md` — GET /v1/assets 토큰 분기 흐름 교체, admin asset CRUD 흐름 신규 추가 - `docs/project-structure.md` — pfhub asset 커맨드 그룹, 신규 api 모듈 반영 - `tests/test_asset_catalog.py` — REQ-010/012/013 AC 테스트 추가 (18개 신규) - `tests/test_v1.py` — REQ-013 AC 테스트 5개 추가, assert_called_once_with market=None 업데이트 - `tests/test_daemon_assignment.py` — assert_called_once_with market=None 업데이트 - `tests/test_cli.py` — FakeRepo.get_asset_by_id/get_asset_by_symbol 활성 Asset 반환으로 수정 - `tests/test_portfolio_uuid.py` — FakeRepo.get_asset_by_id/get_asset_by_symbol 활성 Asset 반환으로 수정 ## Execution Log 1. app/schemas/v1.py — AssetCatalogCreateRequest, AssetCatalogUpdateRequest, AssetCatalogResponse 추가 2. app/cli/commands/asset.py — 신규 파일 생성 (pfhub asset create/list/update/deactivate) 3. app/cli/main.py — asset_app import 및 add_typer 등록 4. app/api/v1_assets.py — list_assets 토큰 분기 재작성 + admin 엔드포인트 3개 추가 5. app/repositories/portfolio_repository.py — Protocol market 파라미터 추가 6. app/repositories/postgres.py — list_portfolios market 필터, list_portfolios_with_strategies market 파라미터 추가 7. app/services/portfolio_service.py — create_portfolio catalog 검증 (get_asset_by_id → active 확인) 8. app/cli/commands/portfolio.py — create --symbol 옵션 추가 (symbol → asset_id 조회 경로) 9. tests/ — FakeRepo 업데이트 (active asset 반환), test_v1.py/test_daemon_assignment.py assert 업데이트 10. tests/test_asset_catalog.py — REQ-010/012/013 신규 테스트 추가 11. docs/ — data-model.md, interface-contract.md, runtime-flows.md, project-structure.md 갱신 ## Validation - pytest 전체 실행: 180 passed, 0 failed - lint/typecheck: 별도 실행 미수행 (테스트 통과로 대체) ## Remaining Risks - admin 엔드포인트 route 순서: `/assets/{asset_id}/deactivate`가 `/assets/{asset_id}` 앞에 등록되어야 FastAPI가 올바르게 라우팅함 — 현재 구현에서 순서 보장됨 - DB 통합 테스트 (market filter SQL `ANY(a.markets)`)는 live PostgreSQL에서만 검증 가능