Browse Source

bug fix 2

sync_core
Lorenzo Pollutri 5 days ago
parent
commit
ecd8c86dff
1 changed files with 77 additions and 9 deletions
  1. +77
    -9
      routes/reslevis.py

+ 77
- 9
routes/reslevis.py View File

@@ -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"}
return {"message": "OK"}

Loading…
Cancel
Save