From 8ac51494c4038776164ea4ee81ee0dc0f1c3904c Mon Sep 17 00:00:00 2001 From: Zhi Date: Sun, 22 Feb 2026 04:21:26 +0000 Subject: [PATCH] feat: dashboard stats API (by status/type/priority) --- app/main.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/app/main.py b/app/main.py index 305e7af..a5de7b7 100644 --- a/app/main.py +++ b/app/main.py @@ -459,3 +459,34 @@ def search_issues( if project_id: query = query.filter(models.Issue.project_id == project_id) return query.offset(skip).limit(limit).all() + + + +# ============ Dashboard / Stats API ============ + +@app.get("/dashboard/stats") +def dashboard_stats(project_id: int = None, db: Session = Depends(get_db)): + """Get issue statistics for dashboard.""" + query = db.query(models.Issue) + if project_id: + query = query.filter(models.Issue.project_id == project_id) + + total = query.count() + by_status = {} + for s in ["open", "in_progress", "resolved", "closed", "blocked"]: + by_status[s] = query.filter(models.Issue.status == s).count() + + by_type = {} + for t in ["task", "story", "test", "resolution"]: + by_type[t] = query.filter(models.Issue.issue_type == t).count() + + by_priority = {} + for p in ["low", "medium", "high", "critical"]: + by_priority[p] = query.filter(models.Issue.priority == p).count() + + return { + "total": total, + "by_status": by_status, + "by_type": by_type, + "by_priority": by_priority, + }