import uuid from datetime import datetime from typing import Any, Optional from common.enums import JobStatus, JobType from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol class JobProtocol(WebPacketProtocol): pass class JobData(WebPacketProtocol): job_id: uuid.UUID job_type: JobType status: JobStatus attempts: int = 0 max_attempts: int = 3 result: Optional[Any] = None last_error: Optional[str] = None run_after: Optional[datetime] = None run_started_at: Optional[datetime] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class Res_Job(Res_WebPacketProtocol): """잡 상태 폴링 응답. 수집·빌드는 몇 분 걸리므로 클라이언트가 이 엔드포인트를 폴링한다.""" job: Optional[JobData] = None class Res_JobOps(Res_WebPacketProtocol): """운영 스냅샷 — 큐 지연·DEAD·좀비 감시용.""" pending: int = 0 running: int = 0 done: int = 0 dead: int = 0 dead_1h: int = 0 stuck_running: int = 0 oldest_pending_sec: int = 0 deadline_1h: int = 0