"""Dashboard routes — list available widgets from active plugins (Task 5.25).""" from __future__ import annotations from fastapi import APIRouter, Depends from sqlalchemy.ext.asyncio import AsyncSession from app.core.db import get_db from app.deps import require_permission from app.plugins.registry import get_registry router = APIRouter(prefix="/api/v1/dashboard", tags=["dashboard"]) @router.get("/widgets") async def list_dashboard_widgets( db: AsyncSession = Depends(get_db), current_user: dict = Depends(require_permission("dashboard:read")), ): """List all available dashboard widgets from active plugins. Returns a flat list of widget definitions contributed by active plugins, sorted by their order field. Each widget includes the contributing plugin name. """ registry = get_registry() manifests = await registry.get_active_manifests(db) widgets: list[dict] = [] for manifest in manifests: for widget in manifest.get("dashboard_widgets", []): widget_copy = dict(widget) widget_copy["plugin_name"] = manifest["name"] widgets.append(widget_copy) # Sort by order field widgets.sort(key=lambda w: w.get("order", 100)) return {"items": widgets, "total": len(widgets)}