diff --git a/routes/reslevis.py b/routes/reslevis.py index bc7e2cb..07deaed 100644 --- a/routes/reslevis.py +++ b/routes/reslevis.py @@ -37,9 +37,10 @@ async def sync_core_get(request: Request) -> None: if request.method != "GET": return - repo = CORE_GET_REPO_BY_PATH.get(request.url.path) - if repo is None: + sync = CORE_GET_SYNC.get(request.url.path) + if sync is None: return + repo, normalizer = sync try: async with httpx.AsyncClient(timeout=CORE_TIMEOUT) as client: @@ -51,6 +52,8 @@ async def sync_core_get(request: Request) -> None: if 200 <= resp.status_code < 300: data = resp.json() if isinstance(data, list): + if normalizer: + data = [normalizer(r) for r in data if isinstance(r, dict)] repo._write_all(data) # aggiorna i file locali except (httpx.RequestError, ValueError): # CORE giù o risposta non valida -> uso il file locale @@ -70,12 +73,77 @@ alarm_repo = AlarmJsonRepository() track_repo = TrackJsonRepository() tracker_zone_repo = TrackerZoneJsonRepository() -CORE_GET_REPO_BY_PATH = { - "/reslevis/getGateways": gateway_repo, - "/reslevis/getZones": zone_repo, - "/reslevis/getTrackers": tracker_repo, - "/reslevis/getTrackerZones": tracker_zone_repo, - "/reslevis/getTracks": track_repo, +def _none_if_empty(v): + return None if v in ("", None, 0, "0") else v + +def _str_or_none(v): + if v in ("", None): + return None + if isinstance(v, (int, float, bool)): + return str(v) + return v + +def _uuid_list(values): + if values in ("", None): + return [] + if isinstance(values, str): + values = [v for v in values.split(",") if v] + if isinstance(values, (list, tuple, set)): + cleaned = [] + for v in values: + if isinstance(v, dict): + v = v.get("id") or v.get("uuid") + if v in ("", None, 0, "0"): + continue + cleaned.append(v) + return cleaned + return [values] if values not in ("", None, 0, "0") else [] + +def _normalize_gateway(row: dict) -> dict: + row = dict(row) + row["floor"] = _none_if_empty(row.get("floor")) + row["building"] = _none_if_empty(row.get("building")) + return row + +def _normalize_tracker(row: dict) -> dict: + row = dict(row) + row["floor"] = _none_if_empty(row.get("floor")) + row["building"] = _none_if_empty(row.get("building")) + row["battery"] = _str_or_none(row.get("battery")) + row["temperature"] = _str_or_none(row.get("temperature")) + row["acceleration"] = _str_or_none(row.get("acceleration")) + row["heartRate"] = _str_or_none(row.get("heartRate")) + return row + +def _normalize_track(row: dict) -> dict: + row = dict(row) + row["gateway"] = _none_if_empty(row.get("gateway")) + row["tracker"] = _none_if_empty(row.get("tracker")) + row["subject"] = _none_if_empty(row.get("subject")) + row["floor"] = _none_if_empty(row.get("floor")) + row["building"] = _none_if_empty(row.get("building")) + row["timestamp"] = _str_or_none(row.get("timestamp")) + row["type"] = _str_or_none(row.get("type")) + row["status"] = _str_or_none(row.get("status")) + row["gatewayMac"] = _str_or_none(row.get("gatewayMac")) + row["trackerMac"] = _str_or_none(row.get("trackerMac")) + row["subjectName"] = _str_or_none(row.get("subjectName")) + # signal resta float o None + row["signal"] = None if row.get("signal") in ("", None) else row.get("signal") + return row + +def _normalize_zone(row: dict) -> dict: + row = dict(row) + row["floor"] = _none_if_empty(row.get("floor")) + row["building"] = _none_if_empty(row.get("building")) + row["groups"] = _uuid_list(row.get("groups")) + return row + +CORE_GET_SYNC = { + "/reslevis/getGateways": (gateway_repo, _normalize_gateway), + "/reslevis/getZones": (zone_repo, _normalize_zone), + "/reslevis/getTrackers": (tracker_repo, _normalize_tracker), + "/reslevis/getTracks": (track_repo, _normalize_track), } @@ -327,4 +395,4 @@ def updateSubject(item: SubjectItem): @router.delete("/removeSubject/{subject_id}", tags=["Reslevis"], dependencies=[Depends(get_current_user)]) def removeSubject(subject_id: str): subject_repo.remove(subject_id) - return {"message": "OK"} \ No newline at end of file + return {"message": "OK"}