머지 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
5.9 KiB
5.9 KiB
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
- Given read 권한 세션 토큰(
permission="read")을 소지한 사용자, WhenGET /v1/assets를 호출, Then HTTP 200 +AssetCatalogListResponse반환. - Given admin 토큰, When
GET /v1/assets를 호출, Then 기존과 동일하게 HTTP 200 반환(회귀 없음). - Given read 권한 사용자, When
GET /v1/assets?status=active·?status=inactive·?status=all로 호출, Then status 필터가 적용된 응답 반환(필터 동작 유지). - Given read 권한 사용자, When
GET /v1/assets?market=KRX로 호출, Then market 필터가 적용된 응답 반환(필터 동작 유지). - Given read 권한 사용자, When
POST /v1/assets(asset 생성)를 호출, Then HTTP 403(쓰기는 admin 유지). - Given read 권한 사용자, When
PATCH /v1/assets/{asset_id}/deactivate를 호출, Then HTTP 403. - Given read 권한 사용자, When
POST /v1/assets/{asset_id}/tags를 호출, Then HTTP 403. - Given read 권한 사용자, When
DELETE /v1/assets/{asset_id}/tags/{tag_id}를 호출, Then HTTP 403. - 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 회귀 확인.