- Replaced @TIER: TRIVIAL with @COMPLEXITY: 1 - Replaced @TIER: STANDARD with @COMPLEXITY: 3 - Replaced @TIER: CRITICAL with @COMPLEXITY: 5 - Manually elevated specific critical/complex components to levels 2 and 4 - Ignored legacy, specs, and node_modules directories - Updated generated semantic map
63 lines
2.6 KiB
Python
63 lines
2.6 KiB
Python
# [DEF:health_router:Module]
|
|
# @COMPLEXITY: 3
|
|
# @SEMANTICS: health, monitoring, dashboards
|
|
# @PURPOSE: API endpoints for dashboard health monitoring and status aggregation.
|
|
# @LAYER: UI/API
|
|
# @RELATION: DEPENDS_ON -> health_service
|
|
|
|
from fastapi import APIRouter, Depends, Query, HTTPException, status
|
|
from typing import List, Optional
|
|
from sqlalchemy.orm import Session
|
|
from ...core.database import get_db
|
|
from ...services.health_service import HealthService
|
|
from ...schemas.health import HealthSummaryResponse
|
|
from ...dependencies import has_permission, get_config_manager, get_task_manager
|
|
|
|
router = APIRouter(prefix="/api/health", tags=["Health"])
|
|
|
|
# [DEF:get_health_summary:Function]
|
|
# @PURPOSE: Get aggregated health status for all dashboards.
|
|
# @PRE: Caller has read permission for dashboard health view.
|
|
# @POST: Returns HealthSummaryResponse.
|
|
# @RELATION: CALLS -> backend.src.services.health_service.HealthService
|
|
@router.get("/summary", response_model=HealthSummaryResponse)
|
|
async def get_health_summary(
|
|
environment_id: Optional[str] = Query(None),
|
|
db: Session = Depends(get_db),
|
|
config_manager = Depends(get_config_manager),
|
|
_ = Depends(has_permission("plugin:migration", "READ"))
|
|
):
|
|
"""
|
|
@PURPOSE: Get aggregated health status for all dashboards.
|
|
@POST: Returns HealthSummaryResponse
|
|
"""
|
|
service = HealthService(db, config_manager=config_manager)
|
|
return await service.get_health_summary(environment_id=environment_id)
|
|
# [/DEF:get_health_summary:Function]
|
|
|
|
|
|
# [DEF:delete_health_report:Function]
|
|
# @PURPOSE: Delete one persisted dashboard validation report from health summary.
|
|
# @PRE: Caller has write permission for tasks/report maintenance.
|
|
# @POST: Validation record is removed; linked task/logs are cleaned when available.
|
|
# @RELATION: CALLS -> backend.src.services.health_service.HealthService
|
|
@router.delete("/summary/{record_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
async def delete_health_report(
|
|
record_id: str,
|
|
db: Session = Depends(get_db),
|
|
config_manager = Depends(get_config_manager),
|
|
task_manager = Depends(get_task_manager),
|
|
_ = Depends(has_permission("tasks", "WRITE")),
|
|
):
|
|
"""
|
|
@PURPOSE: Delete a persisted dashboard validation report from health summary.
|
|
@POST: Validation record is removed; linked task/logs are deleted when present.
|
|
"""
|
|
service = HealthService(db, config_manager=config_manager)
|
|
if not service.delete_validation_report(record_id, task_manager=task_manager):
|
|
raise HTTPException(status_code=404, detail="Health report not found")
|
|
return
|
|
# [/DEF:delete_health_report:Function]
|
|
|
|
# [/DEF:health_router:Module]
|