Coverage for view / web / routes / ohlcv.py: 100%

22 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-04 15:08 +0000

1""" 

2OHLCV 수집 제어 API 엔드포인트. 

3- GET /ohlcv/progress : 현재 수집 진행률 조회 

4- POST /ohlcv/force-update : skip 조건 무시 강제 전체 수집 트리거 

5""" 

6import asyncio 

7from fastapi import APIRouter, HTTPException 

8from view.web.api_common import _get_ctx 

9 

10router = APIRouter() 

11 

12 

13@router.get("/ohlcv/progress") 

14async def get_ohlcv_progress(): 

15 """OHLCV 수집 진행률 반환.""" 

16 ctx = _get_ctx() 

17 task = getattr(ctx, "ohlcv_update_task", None) 

18 if not task: 

19 raise HTTPException(status_code=503, detail="OhlcvUpdateTask가 초기화되지 않았습니다") 

20 return task.get_progress() 

21 

22 

23@router.post("/ohlcv/force-update") 

24async def force_ohlcv_update(): 

25 """skip 조건을 무시하고 전 종목 OHLCV를 강제 재수집한다. 

26 

27 - 최초 설치 / 다른 머신 이전 후 전체 백필이 필요할 때 

28 - DB 데이터 정합성이 의심될 때 

29 수집은 백그라운드로 실행되며 /api/ohlcv/progress 로 진행률을 확인할 수 있다. 

30 """ 

31 ctx = _get_ctx() 

32 task = getattr(ctx, "ohlcv_update_task", None) 

33 if not task: 

34 raise HTTPException(status_code=503, detail="OhlcvUpdateTask가 초기화되지 않았습니다") 

35 

36 progress = task.get_progress() 

37 if progress.get("running"): 

38 raise HTTPException(status_code=409, detail="이미 수집이 진행 중입니다") 

39 

40 asyncio.create_task(task.force_collect()) 

41 return {"success": True, "message": "강제 수집이 시작되었습니다. /api/ohlcv/progress 에서 진행률을 확인하세요."}