import uuid from datetime import datetime from fastapi import APIRouter, Depends, Query, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from api.database import get_session from api.models.progress_event import ProgressEvent from api.schemas.progress_event import ProgressEventCreate, ProgressEventRead router = APIRouter(prefix="/progress", tags=["progress"]) @router.get("/", response_model=list[ProgressEventRead]) async def list_progress( topic_id: uuid.UUID | None = None, workstream_id: uuid.UUID | None = None, task_id: uuid.UUID | None = None, event_type: str | None = None, since: datetime | None = None, limit: int = Query(100, le=1000), offset: int = Query(0, ge=0), session: AsyncSession = Depends(get_session), ) -> list[ProgressEvent]: q = select(ProgressEvent) if topic_id: q = q.where(ProgressEvent.topic_id == topic_id) if workstream_id: q = q.where(ProgressEvent.workstream_id == workstream_id) if task_id: q = q.where(ProgressEvent.task_id == task_id) if event_type: q = q.where(ProgressEvent.event_type == event_type) if since: q = q.where(ProgressEvent.created_at >= since) q = q.order_by(ProgressEvent.created_at.desc()).offset(offset).limit(limit) result = await session.execute(q) return list(result.scalars().all()) @router.post("/", response_model=ProgressEventRead, status_code=status.HTTP_201_CREATED) async def append_progress( body: ProgressEventCreate, session: AsyncSession = Depends(get_session), ) -> ProgressEvent: event = ProgressEvent(**body.model_dump()) session.add(event) await session.commit() await session.refresh(event) return event