DocWeave / backend /app /api /dashboard.py
shak3008's picture
perf: optimize login transition and dashboard loading performance
d135b0e
Raw
History Blame Contribute Delete
2.72 kB
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,
}