Files
portfolio-hub/docs/srs/Interface/req-044_get-v1-assets-require-read-relaxation.md
T
genichinandClaude Opus 4.8 853a9bdab8 docs(dcy-009): confirm-req-implemented — REQ-044/045 Implemented, bat-019 confirmed
머지 PR #16(7f15c6b) 반영. 사용자 read 엔드포인트 delivery 완료. REQ-045 env토큰 처리 200+empty로 문서 동기화(change-req).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
2026-06-27 10:46:35 +09:00

120 lines
5.9 KiB
Markdown

# REQ-044: GET /v1/assets 권한 완화 — require_admin → require_read
- Status: Implemented
- Approved By: 팀장 (Claude), 2026-06-27 (confirm-req)
- Type: Interface
- Priority: High
- Owner: Justin Ko
## Intent
- `GET /v1/assets`(asset 카탈로그 목록 조회) 엔드포인트의 의존성을 `require_admin`에서 `require_read`로 완화해, 일반 인증 사용자가 active asset 카탈로그를 조회할 수 있도록 한다.
- trex-web 포트폴리오 관리 UI(dcy-007)에서 포트폴리오 생성·변경 시 종목 선택 드롭다운/검색이 이 엔드포인트를 소비한다. 현재 `require_admin`으로 막혀 있어 일반 사용자가 접근 불가한 상태다.
- asset 쓰기(POST 생성, PATCH 수정/비활성, POST/DELETE 태그 적용/해제)는 `require_admin`을 유지한다 — 이번 완화는 읽기 하나에 한정한다.
## Requirement
- 시스템은 `GET /v1/assets` 엔드포인트의 인증 의존성을 `require_admin`에서 `require_read`로 변경해야 한다.
- 기존 동작(status 필터·market 필터·`AssetCatalogListResponse` 응답 스키마)은 변경 없이 유지해야 한다.
- asset 쓰기 엔드포인트(`POST /v1/assets`, `PATCH /v1/assets/{asset_id}`, `PATCH /v1/assets/{asset_id}/deactivate`, `POST /v1/assets/{asset_id}/tags`, `DELETE /v1/assets/{asset_id}/tags/{tag_id}`)는 `require_admin`을 유지해야 한다.
- 유효한 read 권한 이상 토큰(session, read service token, admin)으로 `GET /v1/assets`를 호출하면 HTTP 200과 카탈로그 목록을 반환해야 한다.
- 인증 토큰 없는 요청은 HTTP 401, 권한이 없는 토큰은 기존 동작대로 HTTP 403을 반환해야 한다.
## Acceptance Criteria
1. Given read 권한 세션 토큰(`permission="read"`)을 소지한 사용자, When `GET /v1/assets`를 호출, Then HTTP 200 + `AssetCatalogListResponse` 반환.
2. Given admin 토큰, When `GET /v1/assets`를 호출, Then 기존과 동일하게 HTTP 200 반환(회귀 없음).
3. Given read 권한 사용자, When `GET /v1/assets?status=active`·`?status=inactive`·`?status=all`로 호출, Then status 필터가 적용된 응답 반환(필터 동작 유지).
4. Given read 권한 사용자, When `GET /v1/assets?market=KRX`로 호출, Then market 필터가 적용된 응답 반환(필터 동작 유지).
5. Given read 권한 사용자, When `POST /v1/assets`(asset 생성)를 호출, Then HTTP 403(쓰기는 admin 유지).
6. Given read 권한 사용자, When `PATCH /v1/assets/{asset_id}/deactivate`를 호출, Then HTTP 403.
7. Given read 권한 사용자, When `POST /v1/assets/{asset_id}/tags`를 호출, Then HTTP 403.
8. Given read 권한 사용자, When `DELETE /v1/assets/{asset_id}/tags/{tag_id}`를 호출, Then HTTP 403.
9. Given 인증 토큰 없는 요청, When `GET /v1/assets`를 호출, Then HTTP 401.
## Impacted Area
- Docs: `docs/srs/Interface/req-044_get-v1-assets-require-read-relaxation.md` (신규)
- Modules:
- `app/api/v1_assets.py`: `list_catalog_assets` 함수의 `auth: AuthContext = Depends(require_admin)` → `Depends(require_read)` 변경. import에 `require_read` 추가.
- Tests: 기존 `tests/`의 `GET /v1/assets` 관련 테스트에서 read 토큰으로 200 반환하는 케이스 추가. 쓰기 엔드포인트 403 회귀 확인.
## Notes
- asset 카탈로그(거래 가능 종목 메타 — symbol·display_name·markets·status·태그)는 전 인증 사용자에게 read 공개해도 무방하다고 사장님이 확인(dcy-009 OQ-1 Answered 2026-06-27).
- 코드 변경 범위는 `app/api/v1_assets.py` 단일 파일의 `Depends(require_admin)` → `Depends(require_read)` 한 줄이다. 응답 로직·필터·스키마는 변경 없다.
- `require_read`는 `app/core/auth.py`에 이미 정의(`require_read = permission_dependency(Permission.READ)`)되어 있다.
- NFR-1(기존 admin asset 관리·토큰 daemon 바인딩 회귀 0)은 AC-2, AC-5~8의 쓰기 403 확인으로 흡수한다. 별도 NFR REQ 미생성.
- NFR-2(데몬 목록 caller 스코프)는 REQ-045에서 다룬다.
## Change Log
### CHG-20260627-02
- Date: 2026-06-27
- Author: 팀장 (Claude)
#### Change Summary
- 상태 `Approved` → `Implemented` (confirm-req-implemented).
#### Intent
- BAT-019 PR #16이 main(`7f15c6b`)으로 머지 완료됨에 따라 구현·검증 완료를 공식화한다.
#### Acceptance Criteria Delta
- Added: 없음
- Updated: 없음
- Removed: 없음
#### Impacted Area Delta
- Docs: 상태 전환 기록만.
- Modules: 변경 없음.
- Tests: 변경 없음.
#### Delivery Trace Delta
- Batches: BAT-019
- PR: #16 (main 머지, HEAD `7f15c6b`)
- QC: PASS (독립 qc-reviewer)
- Releases: 미정
#### Revalidation Impact
- Reverification Needed: no
- Existing Implementation Invalidated: no
- Status Recommendation: Implemented
- Follow-up Action: 없음
#### Validation Plan
- BAT-019 verification.md Evidence — 472 passed, 0 failed (2026-06-27). AC-1~9 전부 PASS.
---
### CHG-20260627-01
- Date: 2026-06-27
- Author: Justin Ko
#### Change Summary
- 신규 생성 (Proposed) — dcy-009 FR-1 구현을 위한 첫 번째 REQ 초안.
#### Intent
- dcy-009 confirmed Discovery의 FR-1을 REQ로 정규화한다. 코드·테스트 구현의 기준 문서로 사용.
#### Acceptance Criteria Delta
- Added:
- AC-1 ~ AC-9 전체 (신규 초안)
- Updated: 없음
- Removed: 없음
#### Impacted Area Delta
- Docs:
- `docs/srs/Interface/req-044_get-v1-assets-require-read-relaxation.md` 신규 생성
- Modules:
- `app/api/v1_assets.py` (require_admin → require_read 1행)
- Tests:
- read 권한 GET 200 케이스 추가, 쓰기 403 회귀 케이스 확인
#### Delivery Trace Delta
- Batches: 미정 (suggest-batch-reqs 대기)
- Releases: 미정
#### Revalidation Impact
- Reverification Needed: no
- Existing Implementation Invalidated: no
- Status Recommendation: keep-current
- Follow-up Action: confirm-req 후 batch 배정
#### Validation Plan
- pytest로 read 토큰 GET /v1/assets 200 확인, admin 쓰기 403 회귀 확인.