Remove local auth and user-management endpoints in favor of Keycloak-backed metadata users, project context, admin metadata APIs, and agent auth context.
136 lines
5.3 KiB
Python
136 lines
5.3 KiB
Python
from fastapi import APIRouter, Request, Depends, Query, Path, Body
|
|
from typing import Any, List, Dict, Union
|
|
from app.services.tjnetwork import (
|
|
Any,
|
|
get_all_scada_info,
|
|
get_major_node_coords,
|
|
get_major_pipe_nodes,
|
|
get_network_in_extent,
|
|
get_network_link_nodes,
|
|
get_network_node_coords,
|
|
get_node_coord,
|
|
)
|
|
from app.auth.metadata_dependencies import get_current_metadata_user
|
|
from app.infra.cache.redis_client import redis_client, encode_datetime, decode_datetime
|
|
import msgpack
|
|
|
|
router = APIRouter()
|
|
|
|
############################################################
|
|
# coord 24.[COORDINATES]
|
|
############################################################
|
|
|
|
# @router.get("/getcoordschema/")
|
|
# async def fastapi_get_coord_schema(network: str) -> dict[str, dict[str, Any]]:
|
|
# return get_coord_schema(network)
|
|
|
|
# @router.get("/getcoord/")
|
|
# async def fastapi_get_coord(network: str, node: str) -> dict[str, Any]:
|
|
# return get_coord(network, node)
|
|
|
|
# # example: set_coord(p, ChangeSet({'node': 'j1', 'x': 1.0, 'y': 2.0}))
|
|
# @router.post("/setcoord/", response_model=None)
|
|
# async def fastapi_set_coord(network: str, req: Request) -> ChangeSet:
|
|
# props = await req.json()
|
|
# return set_coord(network, ChangeSet(props))
|
|
|
|
@router.get(
|
|
"/getnodecoord/",
|
|
summary="获取节点坐标",
|
|
description="获取指定节点的地理坐标(X, Y)"
|
|
)
|
|
async def fastapi_get_node_coord(
|
|
network: str = Query(..., description="管网名称(或数据库名称)"),
|
|
node: str = Query(..., description="节点ID")
|
|
) -> dict[str, float] | None:
|
|
"""获取节点的地理坐标信息。"""
|
|
return get_node_coord(network, node)
|
|
|
|
# Additional geometry queries found in main.py logic (implicit or explicit)
|
|
@router.get(
|
|
"/getnetworkinextent/",
|
|
summary="获取范围内的网络元素",
|
|
description="获取指定地理范围内的网络节点和管线"
|
|
)
|
|
async def fastapi_get_network_in_extent(
|
|
network: str = Query(..., description="管网名称(或数据库名称)"),
|
|
x1: float = Query(..., description="范围左下角X坐标", alias="x1"),
|
|
y1: float = Query(..., description="范围左下角Y坐标", alias="y1"),
|
|
x2: float = Query(..., description="范围右上角X坐标", alias="x2"),
|
|
y2: float = Query(..., description="范围右上角Y坐标", alias="y2")
|
|
) -> dict[str, Any]:
|
|
"""获取地理范围内的网络几何信息。"""
|
|
return get_network_in_extent(network, x1, y1, x2, y2)
|
|
|
|
@router.get(
|
|
"/getnetworkgeometries/",
|
|
dependencies=[Depends(get_current_metadata_user)],
|
|
summary="获取完整网络几何信息",
|
|
description="获取整个水网的所有节点、管线和SCADA点的几何信息(需要身份验证)"
|
|
)
|
|
async def fastapi_get_network_geometries(
|
|
network: str = Query(..., description="管网名称(或数据库名称)")
|
|
) -> dict[str, Any] | None:
|
|
"""获取完整的网络几何信息,包括所有节点、管线和SCADA点。结果从缓存返回。"""
|
|
cache_key = f"getnetworkgeometries_{network}"
|
|
data = redis_client.get(cache_key)
|
|
if data:
|
|
loaded_dict = msgpack.unpackb(data, object_hook=decode_datetime)
|
|
return loaded_dict
|
|
|
|
coords = get_network_node_coords(network)
|
|
nodes = []
|
|
for node_id, coord in coords.items():
|
|
nodes.append(f"{node_id}:{coord['type']}:{coord['x']}:{coord['y']}")
|
|
links = get_network_link_nodes(network)
|
|
scadas = get_all_scada_info(network)
|
|
|
|
results = {"nodes": nodes, "links": links, "scadas": scadas}
|
|
redis_client.set(cache_key, msgpack.packb(results, default=encode_datetime))
|
|
return results
|
|
|
|
@router.get(
|
|
"/getmajornodecoords/",
|
|
summary="获取主要节点坐标",
|
|
description="获取直径大于等于指定值的节点坐标"
|
|
)
|
|
async def fastapi_get_majornode_coords(
|
|
network: str = Query(..., description="管网名称(或数据库名称)"),
|
|
diameter: int = Query(..., description="最小直径(mm)", gt=0)
|
|
) -> dict[str, dict[str, float]]:
|
|
"""获取主要节点的坐标。只返回直径大于等于指定值的节点。"""
|
|
return get_major_node_coords(network, diameter)
|
|
|
|
@router.get(
|
|
"/getmajorpipenodes/",
|
|
summary="获取主要管道节点",
|
|
description="获取直径大于等于指定值的管道的节点ID"
|
|
)
|
|
async def fastapi_get_major_pipe_nodes(
|
|
network: str = Query(..., description="管网名称(或数据库名称)"),
|
|
diameter: int = Query(..., description="最小直径(mm)", gt=0)
|
|
) -> list[str] | None:
|
|
"""获取主要管道节点。只返回直径大于等于指定值的管道。"""
|
|
return get_major_pipe_nodes(network, diameter)
|
|
|
|
@router.get(
|
|
"/getnetworklinknodes/",
|
|
summary="获取网络管线节点",
|
|
description="获取指定水网所有管线的起点和终点节点"
|
|
)
|
|
async def fastapi_get_network_link_nodes(
|
|
network: str = Query(..., description="管网名称(或数据库名称)")
|
|
) -> list[str] | None:
|
|
"""获取网络中所有管线的连接节点。"""
|
|
return get_network_link_nodes(network)
|
|
|
|
# @router.get("/getallcoords/")
|
|
# async def fastapi_get_all_coords(network: str) -> list[Any]:
|
|
# return get_all_coords(network)
|
|
|
|
# @router.get("/projectcoordinates/")
|
|
# async def fastapi_project_coordinates(
|
|
# network: str, from_epsg: int, to_epsg: int
|
|
# ) -> ChangeSet:
|
|
# return project_coordinates(network, from_epsg, to_epsg)
|