from __future__ import annotations from uuid import UUID from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import func from sqlalchemy.orm import Session from app.core.dependencies import get_current_user from app.database.session import get_db from app.models.document import Document from app.models.knowledge_item import KnowledgeItem from app.models.proposal import Proposal, ProposalStatus from app.models.user import User from app.models.workflow_run import WorkflowRun, WorkflowStatus from app.models.workspace import Workspace router = APIRouter( prefix="/dashboard", tags=["Dashboard"], ) @router.get("/stats") def get_dashboard_stats( workspace_id: UUID, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): workspace = ( db.query(Workspace) .filter( Workspace.id == workspace_id, Workspace.created_by == current_user.id, ) .first() ) if workspace is None: raise HTTPException( status_code=403, detail="You do not have access to this workspace.", ) stats = db.query( db.query(func.count(Document.id)).filter(Document.workspace_id == workspace_id).scalar_subquery().label("total_documents"), db.query(func.count(WorkflowRun.id)).filter(WorkflowRun.workspace_id == workspace_id, WorkflowRun.status == WorkflowStatus.RUNNING).scalar_subquery().label("workflows_running"), db.query(func.count(WorkflowRun.id)).filter(WorkflowRun.workspace_id == workspace_id, WorkflowRun.status == WorkflowStatus.WAITING_FOR_REVIEW).scalar_subquery().label("workflows_waiting_for_review"), db.query(func.count(WorkflowRun.id)).filter(WorkflowRun.workspace_id == workspace_id, WorkflowRun.status == WorkflowStatus.COMPLETED).scalar_subquery().label("workflows_completed"), db.query(func.count(Proposal.id)).filter(Proposal.workspace_id == workspace_id, Proposal.status == ProposalStatus.PENDING).scalar_subquery().label("pending_proposals"), db.query(func.count(KnowledgeItem.id)).filter(KnowledgeItem.workspace_id == workspace_id).scalar_subquery().label("knowledge_items"), ).first() return { "total_documents": (stats.total_documents if stats else 0) or 0, "workflows_running": (stats.workflows_running if stats else 0) or 0, "workflows_waiting_for_review": (stats.workflows_waiting_for_review if stats else 0) or 0, "workflows_completed": (stats.workflows_completed if stats else 0) or 0, "pending_proposals": (stats.pending_proposals if stats else 0) or 0, "knowledge_items": (stats.knowledge_items if stats else 0) or 0, }