From d17072881b0f8abf9775e40861666175976afb1a Mon Sep 17 00:00:00 2001 From: zhi Date: Sun, 22 Mar 2026 00:17:44 +0000 Subject: [PATCH] feat: add general /supports list endpoint with status/taken_by filters - New GET /supports endpoint for listing all support tickets across projects - Supports optional ?status= and ?taken_by= (me|null|username) query params - Ordered by created_at descending - Complements the existing scoped /supports/{project_code}/{milestone_id} endpoint --- app/api/routers/misc.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/api/routers/misc.py b/app/api/routers/misc.py index fefa4a5..aa757d1 100644 --- a/app/api/routers/misc.py +++ b/app/api/routers/misc.py @@ -524,6 +524,35 @@ def _serialize_support(db: Session, support: Support) -> dict: } +@router.get("/supports", tags=["Supports"]) +def list_all_supports( + status: str | None = None, + taken_by: str | None = None, + db: Session = Depends(get_db), + current_user: models.User = Depends(get_current_user_or_apikey), +): + """List support tickets across all projects. Optional status/taken_by filters.""" + query = db.query(Support) + + if status: + query = query.filter(Support.status == SupportStatus(status)) + + if taken_by == "me": + query = query.filter(Support.assignee_id == current_user.id) + elif taken_by == "null": + query = query.filter(Support.assignee_id.is_(None)) + elif taken_by: + assignee = db.query(models.User).filter(models.User.username == taken_by).first() + if assignee: + query = query.filter(Support.assignee_id == assignee.id) + else: + return [] + + query = query.order_by(Support.created_at.desc()) + supports = query.all() + return [_serialize_support(db, s) for s in supports] + + @router.get("/supports/{project_code}/{milestone_id}", tags=["Supports"]) def list_supports(project_code: str, milestone_id: int, db: Session = Depends(get_db)): project = db.query(models.Project).filter(models.Project.project_code == project_code).first()