from uuid import UUID from fastapi import APIRouter, Depends from router.v1.validator.dependencies import IsValidAccessToken, RemoveNoneResponse, RequireDeveloper from services.job_service import JobService from .protocol import Res_Job, Res_JobOps # 작업 큐 라우터. 수집·비전분석·빌드는 몇 분 걸리므로 클라이언트가 여기를 폴링한다. router = APIRouter(prefix="/v1/job", tags=["Job"], responses={404: {"description": "Not found"}}) @router.get( path="/ops", response_model=Res_JobOps, dependencies=[Depends(RequireDeveloper)], summary="큐 운영 스냅샷", description="상태별 카운트 + 큐 지연 + 최근 1시간 DEAD + 좀비(stuck). 내부 운영 전용.", ) async def job_ops(service: JobService = Depends()): return RemoveNoneResponse(await service.ops()) @router.get( path="/{job_id}", response_model=Res_Job, dependencies=[Depends(IsValidAccessToken)], summary="잡 상태 조회(폴링)", ) async def get_job(job_id: UUID, service: JobService = Depends()): return RemoveNoneResponse(await service.get_job(str(job_id))) @router.post( path="/{job_id}/requeue", response_model=Res_Job, dependencies=[Depends(RequireDeveloper)], summary="DEAD 잡 재큐", description="max_attempts 를 소진해 dead-letter 로 간 잡을 다시 대기로 돌린다. 내부 운영 전용.", ) async def requeue_job(job_id: UUID, service: JobService = Depends()): return RemoveNoneResponse(await service.requeue(str(job_id)))