| 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, |
| } |
|
|