Files
portfolio-hub/docs/srs/Interface/req-018_service-token-http-daemon-id-forward.md
T
genichinandClaude Sonnet 4.6 6add0ade29 feat: REQ-001~018 Implemented 전환, REQ-010 GET /v1/assets admin catalog 재정의, REL-001 draft
- confirm-req-implemented: REQ-001~018 (17건, REQ-013 제외) Approved → Implemented
  - BAT-001(REQ-009/011/014), BAT-002(REQ-010/012/015), BAT-003(REQ-001/002/003/006)
  - BAT-004(REQ-004/005), BAT-005(REQ-007/008), BAT-006(REQ-016/017/018)
  - CHG-20260521-01 entry 각 REQ에 추가; SRS index Recent Change Log 갱신

- REQ-010 CHG-20260521-02: GET /v1/assets admin catalog 전용 재정의
  - 기존 token_type 분기 portfolio 조회 코드 제거, admin permission + list_assets() 호출로 대체
  - AssetCatalogListResponse 스키마 추가 (items/total)
  - REQ-010 Status: Implemented → Approved (재검증 필요)
  - 테스트 343건 전체 통과: service/user token 403, admin token 200 + catalog schema 검증

- migration 보강: portfolios_asset_migration market 컬럼 부재 fallback,
  portfolio_tags 빈 테이블 early-return, service_token index fix autocommit_block 정리

- docs/releases/rel-001: REL-001 draft 추가 (BAT-001~011 포함)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 10:17:39 +00:00

5.5 KiB

REQ-018: POST /auth/service-tokens body daemon_id forward 보정

  • Status: Implemented
  • Type: Interface
  • Priority: High
  • Owner: Justin Ko

Intent

  • 현행 POST /auth/service-tokens HTTP route(app/api/auth_routes.py:131-137)가 IssueServiceTokenRequest.daemon_id 필드를 스키마에서 노출하지만 service.issue_service_token 호출 시 forward하지 않아 silently drop되는 결함을 정상화한다.
  • CLI pfhub service-token issue --daemon-id는 정상 forward하나 HTTP 경로만 daemon binding이 불가능한 상태였다. HTTP/CLI 일관성을 회복한다.

Requirement

  • app/api/auth_routes.py:131-137의 service.issue_service_token(...) 호출에 daemon_id=payload.daemon_id를 추가한다.
  • 비존재 또는 비활성 daemon_id가 body로 전달되면 AuthService.issue_service_token의 기존 검증 로직(get_daemon_by_id None 또는 is_active=False)이 ValueError를 발생시키고, _raise_auth_error를 통해 HTTP 4xx로 변환된다.
  • daemon_id 검증 실패 응답 코드는 ValueError detail에 따라 HTTP 400 또는 404로 분기된다(_raise_auth_error 기존 로직).
  • 본 REQ는 HTTP body daemon_id 처리만 보정한다. CLI 동작, daemon registry 자체, service token 발급 정책은 변경하지 않는다.

Acceptance Criteria

  1. Given admin token, When POST /auth/service-tokens body {"name": "...", "username": "...", "daemon_id": "<existing-active-daemon-id>"} 호출, Then HTTP 201 + issued token의 auth_token.daemon_id == <daemon-id> 반환.
  2. Given admin token, When POST /auth/service-tokens body {"name": "...", "username": "...", "daemon_id": "<non-existing-daemon-id>"} 호출, Then HTTP 4xx + _raise_auth_error 패턴에 따른 오류 메시지 반환.
  3. Given admin token, When POST /auth/service-tokens body daemon_id 필드 미포함 또는 null, Then 기존 동작 유지(daemon binding 없는 service token 발급, HTTP 201).
  4. Given AC-1과 CLI pfhub service-token issue NAME --user U --daemon-id <daemon-id> 실행 결과 비교, When 둘 다 발급된 토큰의 daemon_id 확인, Then 동일한 값이 저장된다(HTTP/CLI 동등성).

Impacted Area

  • Docs:
    • docs/interface-contract.md — POST /auth/service-tokens body 명세에 daemon_id forward 동작 추가 (REQ-019에서 처리)
  • Modules:
    • app/api/auth_routes.py:131-137 — issue_service_token 호출 시 daemon_id=payload.daemon_id 추가
  • Tests:
    • 갱신 tests/test_auth.py — AC-1~3 HTTP request 시뮬레이션 추가
    • 갱신 tests/test_daemon_registry.py — AC-4 HTTP/CLI 동등성 회귀

Notes

  • 본 REQ는 1-line 보정에 가까운 단순 결함 수정이지만, HTTP API 사용자에게는 daemon binding 경로가 새로 작동하기 시작하는 의미 있는 변경이라 별도 REQ로 분리.
  • daemon registry 자체(존재/활성 검증)는 기존 AuthService.issue_service_token 내부 로직이 그대로 처리하므로 본 REQ에서는 daemon 모델을 건드리지 않는다.
  • HTTP body daemon_id를 누락하거나 null로 보내는 경우의 기본 동작(unbound service token 발급)은 dcy-004 OQ-7에서 "수동 매핑" 정책이 결정되었으므로 본 REQ에서 추가 제한하지 않는다. NULL daemon 토큰의 운영 정리는 REQ-023(마이그레이션 CLI)에서 처리.
  • Source: dcy-004 FR-3.

Change Log

CHG-20260521-01

  • Date: 2026-05-21
  • Author: Justin Ko

Change Summary

  • Status: Approved → Implemented

Intent

  • BAT-006 confirm-batch-verification 완료. POST /auth/service-tokens daemon_id forward 1-line 보정 구현. HTTP/CLI daemon binding 동등성, non-existing daemon 4xx 분기 모든 AC 검증 통과.

Acceptance Criteria Delta

  • No change

Impacted Area Delta

  • No change

Delivery Trace Delta

  • Batches:
    • BAT-006
  • Releases:
    • REL-001

Revalidation Impact

  • Reverification Needed: no
  • Existing Implementation Invalidated: no
  • Status Recommendation: implemented
  • Follow-up Action: none

CHG-20260520-02

  • Date: 2026-05-20
  • Author: Justin Ko

Change Summary

  • Status: Proposed → Approved

Intent

  • 승인 게이트 통과: 필수 필드(Status/Type/Priority/Owner/Intent/Requirement/AC/Impacted Area/Change Log) 모두 충족, AC 구체성 확인 완료, blocker 없음

Acceptance Criteria Delta

  • No change

Impacted Area Delta

  • No change

Delivery Trace Delta

  • Batches: none (미정)
  • Releases: none (미정)

Revalidation Impact

  • Reverification Needed: no
  • Existing Implementation Invalidated: no
  • Status Recommendation: promote-to-approved
  • Follow-up Action: batch 계획 편입

CHG-20260520-01

  • Date: 2026-05-20
  • Author: Justin Ko

Change Summary

  • 최초 생성 — dcy-004 confirm-discovery 후 draft-req 실행. dcy-004 FR-3 산출물.

Intent

  • HTTP/CLI 토큰 발급 surface 일관성 회복 (daemon_id forward 누락 결함 정상화).

Acceptance Criteria Delta

  • Added:
    • AC-1~4 최초 작성

Impacted Area Delta

  • Docs: docs/interface-contract.md (REQ-019에서 처리)
  • Modules: app/api/auth_routes.py — 최초 지정
  • Tests: tests/test_auth.py, tests/test_daemon_registry.py — 최초 지정

Delivery Trace Delta

  • Batches: none (미정)
  • Releases: none (미정)

Revalidation Impact

  • Reverification Needed: no
  • Existing Implementation Invalidated: no
  • Status Recommendation: keep-current
  • Follow-up Action: confirm-req 후 batch 계획 편입

Validation Plan

  • pytest TestClient로 AC-1~4 검증; HTTP/CLI 동등성 회귀