from datetime import datetime, timedelta, timezone from fastapi import APIRouter, Depends from pydantic import BaseModel from sqlalchemy import func, select from sqlalchemy.orm import Session, joinedload from app.auth.jwt_auth import get_current_user from app.database import get_db from app.models import Event, Host, Problem from app.schemas.list_models import EventSummary router = APIRouter(prefix="/dashboards", tags=["dashboards"]) class DashboardSummary(BaseModel): events_last_24h: int hosts_total: int problems_open: int severity_24h: dict[str, int] recent_events: list[EventSummary] @router.get("/summary", response_model=DashboardSummary) def dashboard_summary( db: Session = Depends(get_db), _user: str = Depends(get_current_user), ) -> DashboardSummary: since = datetime.now(timezone.utc) - timedelta(hours=24) events_24h = db.scalar( select(func.count()).select_from(Event).where(Event.received_at >= since) ) or 0 hosts_total = db.scalar(select(func.count()).select_from(Host)) or 0 problems_open = ( db.scalar(select(func.count()).select_from(Problem).where(Problem.status == "open")) or 0 ) severity_rows = db.execute( select(Event.severity, func.count()) .where(Event.received_at >= since) .group_by(Event.severity) ).all() severity_24h = {row[0]: row[1] for row in severity_rows} recent = db.scalars( select(Event) .join(Host) .options(joinedload(Event.host)) .order_by(Event.received_at.desc()) .limit(8) ).all() recent_events = [ EventSummary( id=e.id, event_id=e.event_id, host_id=e.host_id, hostname=e.host.hostname, occurred_at=e.occurred_at, received_at=e.received_at, category=e.category, type=e.type, severity=e.severity, title=e.title, summary=e.summary, ) for e in recent ] return DashboardSummary( events_last_24h=events_24h, hosts_total=hosts_total, problems_open=problems_open, severity_24h=severity_24h, recent_events=recent_events, )