generated from coulomb/repo-seed
feat: use hub-core progress router
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user