"""长任务轮询端点 GET /jobs/:id(ARCH §7.4)。""" from __future__ import annotations import uuid from typing import Annotated from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from ww_db import get_session from ww_db.models import Job from ww_shared import AppError, ErrorCode, ErrorEnvelope from ww_api.schemas.jobs import JobResponse router = APIRouter(prefix="/jobs", tags=["jobs"]) @router.get( "/{job_id}", responses={404: {"model": ErrorEnvelope, "description": "job 不存在"}}, ) async def get_job( job_id: uuid.UUID, session: Annotated[AsyncSession, Depends(get_session)], ) -> JobResponse: job = (await session.execute(select(Job).where(Job.id == job_id))).scalar_one_or_none() if job is None: raise AppError(ErrorCode.NOT_FOUND, f"job {job_id} not found") return JobResponse( id=job.id, kind=job.kind, status=job.status, progress=job.progress, result=job.result, error=job.error, )