from fastapi import APIRouter, Depends from app.api.v1.endpoints import ( access, admin_metadata, agent_auth, audit, burst_detection, burst_location, cache, extension, geocoding, leakage, meta, misc, model_import, project, project_data, risk, scada, schemes, sensor_placement, simulation, snapshots, users, web_search, ) from app.api.v1.endpoints.components import ( controls, curves, options, patterns, quality, visuals, ) from app.api.v1.endpoints.network import ( demands, general, geometry, junctions, pipes, pumps, regions, reservoirs, tags, tanks, valves, ) from app.api.v1.endpoints.timeseries import ( composite as ts_composite, realtime as ts_realtime, scada as ts_scada, scheme as ts_scheme, ) from app.auth.permissions import ( BURST_RUN, OPTIMIZATION_RUN, RISK_RUN, SCADA_CLEAN, SCADA_VIEW, SIMULATION_RUN, SIMULATION_VIEW, WEBGIS_EDIT, WEBGIS_VIEW, require_method_permission, require_permission, ) api_router = APIRouter() webgis_access = Depends( require_method_permission( read_permission=WEBGIS_VIEW, write_permission=WEBGIS_EDIT, ) ) scada_access = Depends( require_method_permission( read_permission=SCADA_VIEW, write_permission=SCADA_CLEAN, ) ) simulation_access = Depends( require_method_permission( read_permission=SIMULATION_VIEW, write_permission=SIMULATION_RUN, ) ) webgis_view_access = Depends(require_permission(WEBGIS_VIEW)) simulation_run_access = Depends(require_permission(SIMULATION_RUN)) burst_run_access = Depends(require_permission(BURST_RUN)) risk_run_access = Depends(require_permission(RISK_RUN)) optimization_run_access = Depends(require_permission(OPTIMIZATION_RUN)) # Core services api_router.include_router(access.router, tags=["Access Control"]) api_router.include_router(agent_auth.router, tags=["Agent Auth"]) api_router.include_router( admin_metadata.router, prefix="/admin", tags=["Metadata Admin"], ) api_router.include_router(model_import.router, tags=["Model Administration"]) api_router.include_router(audit.router, prefix="/audit", tags=["Audit Logs"]) api_router.include_router(meta.router, tags=["Metadata"]) api_router.include_router( project.router, tags=["Project"], dependencies=[webgis_access], ) # WebGIS data for endpoint_router, tag in ( (general.router, "Network General"), (junctions.router, "Junctions"), (reservoirs.router, "Reservoirs"), (tanks.router, "Tanks"), (pipes.router, "Pipes"), (pumps.router, "Pumps"), (valves.router, "Valves"), (tags.router, "Tags"), (demands.router, "Demands"), (geometry.router, "Geometry & Coordinates"), (regions.router, "Regions & DMAs"), (curves.router, "Curves"), (patterns.router, "Patterns"), (controls.router, "Controls & Rules"), (options.router, "Options"), (quality.router, "Quality"), (visuals.router, "Visuals"), ): api_router.include_router( endpoint_router, tags=[tag], dependencies=[webgis_access], ) # Simulation and analysis api_router.include_router( simulation.router, tags=["Simulation Control"], dependencies=[simulation_run_access], ) api_router.include_router(scada.router, dependencies=[scada_access]) api_router.include_router( sensor_placement.router, tags=["Sensor Placement"], dependencies=[optimization_run_access], ) api_router.include_router( snapshots.router, tags=["Snapshots"], dependencies=[simulation_access], ) api_router.include_router( users.router, tags=["Users"], dependencies=[webgis_view_access], ) api_router.include_router( schemes.router, tags=["Schemes"], dependencies=[simulation_access], ) api_router.include_router( misc.router, tags=["Misc"], dependencies=[webgis_view_access], ) api_router.include_router( risk.router, tags=["Risk"], dependencies=[risk_run_access], ) api_router.include_router( cache.router, tags=["Cache"], dependencies=[simulation_run_access], ) api_router.include_router( web_search.router, tags=["Web Search"], dependencies=[webgis_view_access], ) api_router.include_router( geocoding.router, tags=["Geocoding"], dependencies=[webgis_view_access], ) api_router.include_router( leakage.router, prefix="/leakage", tags=["Leakage"], dependencies=[burst_run_access], ) api_router.include_router( burst_detection.router, prefix="/burst-detection", tags=["Burst Detection"], dependencies=[burst_run_access], ) api_router.include_router( burst_location.router, prefix="/burst-location", tags=["Burst Location"], dependencies=[burst_run_access], ) # TimescaleDB data for endpoint_router, tag in ( (ts_realtime.router, "TimescaleDB - Realtime"), (ts_scheme.router, "TimescaleDB - Scheme"), ): api_router.include_router( endpoint_router, tags=[tag], dependencies=[simulation_access], ) for endpoint_router, tag in ( (ts_scada.router, "TimescaleDB - SCADA"), (ts_composite.router, "TimescaleDB - Composite"), ): api_router.include_router( endpoint_router, tags=[tag], dependencies=[scada_access], ) api_router.include_router( project_data.router, tags=["Project Data"], dependencies=[webgis_view_access], ) api_router.include_router( extension.router, tags=["Extension"], dependencies=[webgis_access], )