50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""Dashboard endpoints: overview stats."""
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import func
|
|
from app.database import get_db
|
|
from app.api.deps import get_current_user
|
|
from app.models.user import User
|
|
from app.models.project import Project
|
|
from app.models.task import Task
|
|
from app.models.worker import AIWorker
|
|
from app.models.review import Review
|
|
from app.services.cost_service import CostService
|
|
|
|
router = APIRouter(prefix="/dashboard")
|
|
|
|
|
|
@router.get("")
|
|
def dashboard(
|
|
user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
tid = user.tenant_id
|
|
|
|
projects = db.query(Project).filter(Project.tenant_id == tid).count()
|
|
tasks = db.query(Task).filter(Task.tenant_id == tid)
|
|
workers = db.query(AIWorker).filter(AIWorker.tenant_id == tid, AIWorker.is_active == True).count()
|
|
pending_reviews = db.query(Review).filter(
|
|
Review.tenant_id == tid, Review.status == "pending"
|
|
).count()
|
|
|
|
task_status_counts = {}
|
|
for row in db.query(Task.status, func.count()).filter(Task.tenant_id == tid).group_by(Task.status).all():
|
|
task_status_counts[row[0]] = row[1]
|
|
|
|
cost_summary = CostService.get_tenant_cost_summary(db, tid)
|
|
|
|
return {
|
|
"projects": projects,
|
|
"tasks": tasks.count(),
|
|
"active_workers": workers,
|
|
"pending_reviews": pending_reviews,
|
|
"task_status": task_status_counts,
|
|
"cost": cost_summary,
|
|
"user": {
|
|
"id": user.id,
|
|
"username": user.username,
|
|
"role": user.role,
|
|
},
|
|
}
|