diff --git a/api/routers/progress.py b/api/routers/progress.py index ddb73b4..e148ce4 100644 --- a/api/routers/progress.py +++ b/api/routers/progress.py @@ -1,51 +1,13 @@ -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 +from hub_core.routers.progress import create_progress_router -router = APIRouter(prefix="/progress", tags=["progress"]) +router = create_progress_router( + get_session, + progress_model=ProgressEvent, + progress_create_schema=ProgressEventCreate, + progress_read_schema=ProgressEventRead, +) - -@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 +__all__ = ["router"] diff --git a/tests/test_mcp_smoke.py b/tests/test_mcp_smoke.py index 7f53c1c..86bfc68 100644 --- a/tests/test_mcp_smoke.py +++ b/tests/test_mcp_smoke.py @@ -155,6 +155,27 @@ class TestAddProgressEvent: }) assert r.status_code == 201 + async def test_progress_list_filters_by_topic(self, client): + await _create_domain(client) + topic = await _create_topic(client) + + scoped = await client.post("/progress/", json={ + "topic_id": topic["id"], + "summary": "Topic scoped note", + "event_type": "note", + }) + assert scoped.status_code == 201 + freeform = await client.post("/progress/", json={ + "summary": "Freeform note", + "event_type": "note", + }) + assert freeform.status_code == 201 + + r = await client.get("/progress/", params={"topic_id": topic["id"]}) + assert r.status_code == 200 + body = r.json() + assert [event["id"] for event in body] == [scoped.json()["id"]] + # --------------------------------------------------------------------------- # flag_for_human — PATCH /tasks/{id} with needs_human=True