from typing import Any from datetime import datetime from fastapi import APIRouter, HTTPException from pydantic import BaseModel from app.services.leakage_identifier import ( get_leakage_identify_scheme_detail, list_leakage_identify_schemes, run_leakage_identification, ) router = APIRouter() class LeakageIdentifyRequest(BaseModel): network: str observed_pressure_data: str | dict[str, list[Any]] | list[dict[str, Any]] | None = None start_time: float = 0 duration: float = 24 timestep: float = 5 q_sum: float = 0.2 q_sum_unit: str = "m3/s" output_dir: str = "Results" pop_size: int = 50 max_gen: int = 100 output_flow_unit: str = "m3/s" dma_count: int | None = None scada_start: datetime | None = None scada_end: datetime | None = None sensor_nodes: list[str] | None = None scheme_name: str | None = None username: str = "admin" @router.post("/identify/") async def identify_leakage(data: LeakageIdentifyRequest) -> dict[str, Any]: try: return run_leakage_identification(**data.dict()) except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) @router.get("/schemes/") async def query_leakage_schemes( network: str, query_date: datetime | None = None ) -> list[dict[str, Any]]: try: return list_leakage_identify_schemes(network=network, query_date=query_date) except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) @router.get("/schemes/{scheme_name}") async def query_leakage_scheme_detail( network: str, scheme_name: str ) -> dict[str, Any]: try: return get_leakage_identify_scheme_detail(network=network, scheme_name=scheme_name) except Exception as exc: raise HTTPException(status_code=400, detail=str(exc))