| @@ -37,9 +37,10 @@ async def sync_core_get(request: Request) -> None: | |||||
| if request.method != "GET": | if request.method != "GET": | ||||
| return | 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 | return | ||||
| repo, normalizer = sync | |||||
| try: | try: | ||||
| async with httpx.AsyncClient(timeout=CORE_TIMEOUT) as client: | 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: | if 200 <= resp.status_code < 300: | ||||
| data = resp.json() | data = resp.json() | ||||
| if isinstance(data, list): | 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 | repo._write_all(data) # aggiorna i file locali | ||||
| except (httpx.RequestError, ValueError): | except (httpx.RequestError, ValueError): | ||||
| # CORE giù o risposta non valida -> uso il file locale | # CORE giù o risposta non valida -> uso il file locale | ||||
| @@ -70,12 +73,77 @@ alarm_repo = AlarmJsonRepository() | |||||
| track_repo = TrackJsonRepository() | track_repo = TrackJsonRepository() | ||||
| tracker_zone_repo = TrackerZoneJsonRepository() | 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)]) | @router.delete("/removeSubject/{subject_id}", tags=["Reslevis"], dependencies=[Depends(get_current_user)]) | ||||
| def removeSubject(subject_id: str): | def removeSubject(subject_id: str): | ||||
| subject_repo.remove(subject_id) | subject_repo.remove(subject_id) | ||||
| return {"message": "OK"} | |||||
| return {"message": "OK"} | |||||