feat: /api/watchlist CRUD (#3) + deps.get_session 트랜잭션 버그 수정 #17

Merged
xhh merged 2 commits from issue-3-watchlist-crud into main 2026-04-22 02:17:31 +09:00
Owner

요약

models.Watchlist 기반 CRUD 엔드포인트 5개. 읽기는 read, 변경은 write 스코프.

  • GET /api/watchlist (active_only, market 필터)
  • GET /api/watchlist/{ticker}
  • POST /api/watchlist (409 on duplicate)
  • PATCH /api/watchlist/{ticker}
  • DELETE /api/watchlist/{ticker} (soft delete, idempotent)

부수 버그 수정

기존 api.deps.get_session 이 commit 없이 close 만 했기 때문에 mutation 이 전부 롤백되는 이슈 발견. 요청 종료 시 commit, 예외 시 rollback 으로 수정. 이후 reports/collect 엔드포인트에서도 동일 패턴 활용.

검증

로컬에서 9가지 시나리오 (create/duplicate-409/persist/update/delete/list-active/list-all/idempotent-delete/cleanup) 전부 기대대로 통과.

Closes #3

## 요약 models.Watchlist 기반 CRUD 엔드포인트 5개. 읽기는 read, 변경은 write 스코프. - GET /api/watchlist (active_only, market 필터) - GET /api/watchlist/{ticker} - POST /api/watchlist (409 on duplicate) - PATCH /api/watchlist/{ticker} - DELETE /api/watchlist/{ticker} (soft delete, idempotent) ## 부수 버그 수정 기존 api.deps.get_session 이 commit 없이 close 만 했기 때문에 mutation 이 전부 롤백되는 이슈 발견. 요청 종료 시 commit, 예외 시 rollback 으로 수정. 이후 reports/collect 엔드포인트에서도 동일 패턴 활용. ## 검증 로컬에서 9가지 시나리오 (create/duplicate-409/persist/update/delete/list-active/list-all/idempotent-delete/cleanup) 전부 기대대로 통과. Closes #3
기존 get_session 은 yield 후 단순 close 만 호출해 POST/PATCH/DELETE 라우터의 session.flush() 결과가 트랜잭션 끝에서 롤백되는 버그. 읽기 전용 라우터만 있을 때는 드러나지 않았으나 watchlist CRUD 추가 테스트에서 mutation 이 영속되지 않는 현상으로 확인.

수정: yield 다음 session.commit(), 예외 시 rollback, 항상 close. FastAPI dependency 관례에 맞춘 표준 패턴.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
models.Watchlist 기반 표준 CRUD. 읽기는 read 스코프, 생성/수정/삭제는 write 스코프 필요. 삭제는 soft delete (active=False) — insider_trades 등 외래 참조가 있어 물리 삭제 피함.

엔드포인트:
- GET    /api/watchlist                  — 목록 (active_only, market 필터)
- GET    /api/watchlist/{ticker}         — 단일 조회 (404 on missing)
- POST   /api/watchlist                  — 신규 생성 (409 on duplicate)
- PATCH  /api/watchlist/{ticker}         — 부분 수정 (None 필드 제외)
- DELETE /api/watchlist/{ticker}         — soft delete, idempotent

스키마:
- WatchlistItem: 응답 (from_attributes=True 로 ORM 직렬화)
- WatchlistCreate: POST 바디 (ticker 필수)
- WatchlistUpdate: PATCH 바디 (전 필드 선택)

Literal 타입으로 market(us/kr), schedule(daily/weekly/biweekly/monthly) 값 검증.

검증: 9가지 시나리오(create/duplicate/persist/update/delete/list-active/list-all/idempotent-delete/cleanup) 전부 기대대로 통과.

Closes #3

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
xhh merged commit aad396ad1a into main 2026-04-22 02:17:31 +09:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
xhh/financial-data-platform!17
No description provided.