from typing import Any from app.native.wndb.core.database import read_all, try_read def get_scada_info_schema(name: str) -> dict[str, dict[str, Any]]: return { "device_id": {"type": "str", "optional": False, "readonly": True}, "device_type": {"type": "str", "optional": False, "readonly": True}, "node_id": {"type": "str", "optional": True, "readonly": True}, "link_id": {"type": "str", "optional": True, "readonly": True}, "api_query_id": {"type": "str", "optional": True, "readonly": True}, "transmission_mode": {"type": "str", "optional": False, "readonly": True}, "transmission_frequency": {"type": "str", "optional": False, "readonly": True}, "reliability": {"type": "int", "optional": False, "readonly": True}, "x": {"type": "float", "optional": True, "readonly": True}, "y": {"type": "float", "optional": True, "readonly": True}, } _SELECT = """ SELECT device_id, device_type, node_id, link_id, api_query_id, transmission_mode, transmission_frequency, reliability, x, y FROM asset.scada_devices """ _SELECT_MATERIALIZED = """ SELECT id AS device_id, device_type, node_id, link_id, api_query_id, transmission_mode, transmission_frequency, reliability, x, y FROM gis.scada_devices """ def _device(row: dict[str, Any]) -> dict[str, Any]: return { "device_id": str(row["device_id"]), "device_type": str(row["device_type"]), "node_id": str(row["node_id"]) if row["node_id"] is not None else None, "link_id": str(row["link_id"]) if row["link_id"] is not None else None, "api_query_id": ( str(row["api_query_id"]) if row["api_query_id"] is not None else None ), "transmission_mode": str(row["transmission_mode"]), "transmission_frequency": str(row["transmission_frequency"]), "reliability": int(row["reliability"]), "x": float(row["x"]) if row["x"] is not None else None, "y": float(row["y"]) if row["y"] is not None else None, } def get_scada_info(name: str, device_id: str) -> dict[str, Any]: row = try_read( name, _SELECT + " WHERE device_id = %s", (device_id,), ) return _device(row) if row else {} def get_all_scada_info(name: str) -> list[dict[str, Any]]: return [ _device(row) for row in read_all(name, _SELECT_MATERIALIZED + " ORDER BY device_id") ]