# 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 회귀 확인.