From 62fd7673dc53b8b38286d20a47ee07fad526393c Mon Sep 17 00:00:00 2001 From: pollutri Date: Tue, 10 Feb 2026 13:35:29 +0100 Subject: [PATCH] API for gui settings --- logica_reslevis/config.py | 1 + logica_reslevis/setting.py | 72 ++++++++++++++++++++++++++++++++++++++ routes/reslevis.py | 31 ++++++++++++++++ schemas/reslevis.py | 10 ++++++ 4 files changed, 114 insertions(+) create mode 100644 logica_reslevis/setting.py diff --git a/logica_reslevis/config.py b/logica_reslevis/config.py index a26ff10..417697a 100644 --- a/logica_reslevis/config.py +++ b/logica_reslevis/config.py @@ -24,4 +24,5 @@ SUBJECT_JSON_PATH = DATA_DIR / "subject.json" ALARM_JSON_PATH = DATA_DIR / "active_alarm.json" TRACK_JSON_PATH = DATA_DIR / "tracks.json" TRACKER_ZONE_JSON_PATH = DATA_DIR / "tracker_zone.json" +SETTING_JSON_PATH = DATA_DIR / "settings.json" diff --git a/logica_reslevis/setting.py b/logica_reslevis/setting.py new file mode 100644 index 0000000..d30b155 --- /dev/null +++ b/logica_reslevis/setting.py @@ -0,0 +1,72 @@ +import json +from typing import List, Dict, Any, Optional + +from fastapi.encoders import jsonable_encoder + +from schemas.reslevis import SettingItem +from .config import SETTING_JSON_PATH +from .gateway import _LockedFile, _atomic_write, _norm_str, _index_by_id + + +class SettingJsonRepository: + def __init__(self, json_path: str = SETTING_JSON_PATH): + self.path = json_path + + def _read_all(self) -> List[Dict[str, Any]]: + with _LockedFile(self.path, "r") as fp: + try: + fp.seek(0) + data = fp.read().strip() + return json.loads(data) if data else [] + except json.JSONDecodeError: + return [] + + def _write_all(self, rows: List[Dict[str, Any]]) -> None: + payload = json.dumps(rows, ensure_ascii=False, indent=2) + _atomic_write(self.path, payload) + + def list(self, search_string: Optional[str] = None) -> List[Dict[str, Any]]: + rows = self._read_all() + if search_string: + s = search_string.lower() + rows = [ + r + for r in rows + if any( + isinstance(r.get(k), str) and s in (r.get(k) or "").lower() + for k in ("name", "role", "language") + ) + ] + return rows + + def add(self, item: SettingItem) -> None: + rows = self._read_all() + obj = jsonable_encoder(item) + obj_id = _norm_str(obj.get("id")) + + if any(_norm_str(r.get("id")) == obj_id for r in rows): + raise ValueError(f"Setting con id '{obj_id}' gi\u00e0 presente") + + rows.append(obj) + self._write_all(rows) + + def update(self, item: SettingItem) -> None: + rows = self._read_all() + obj = jsonable_encoder(item) + obj_id = _norm_str(obj.get("id")) + + idx = _index_by_id(rows, obj_id) + if idx is None: + raise ValueError(f"Setting con id '{obj_id}' non trovato") + + rows[idx] = obj + self._write_all(rows) + + def remove(self, setting_id: str) -> None: + rows = self._read_all() + idx = _index_by_id(rows, setting_id) + if idx is None: + raise ValueError(f"Setting con id '{setting_id}' non trovato") + + del rows[idx] + self._write_all(rows) diff --git a/routes/reslevis.py b/routes/reslevis.py index 07deaed..01af603 100644 --- a/routes/reslevis.py +++ b/routes/reslevis.py @@ -14,6 +14,7 @@ from schemas.reslevis import ( AlarmItem, TrackItem, TrackerZoneItem, + SettingItem, ) from logica_reslevis.gateway import GatewayJsonRepository @@ -22,6 +23,7 @@ from logica_reslevis.floor import FloorJsonRepository from logica_reslevis.zone import ZoneJsonRepository from logica_reslevis.tracker import TrackerJsonRepository from logica_reslevis.operator import OperatorJsonRepository +from logica_reslevis.setting import SettingJsonRepository from logica_reslevis.subject import SubjectJsonRepository from logica_reslevis.alarm import AlarmJsonRepository from logica_reslevis.track import TrackJsonRepository @@ -72,6 +74,7 @@ subject_repo = SubjectJsonRepository() alarm_repo = AlarmJsonRepository() track_repo = TrackJsonRepository() tracker_zone_repo = TrackerZoneJsonRepository() +setting_repo = SettingJsonRepository() def _none_if_empty(v): return None if v in ("", None, 0, "0") else v @@ -396,3 +399,31 @@ def updateSubject(item: SubjectItem): def removeSubject(subject_id: str): subject_repo.remove(subject_id) return {"message": "OK"} + + +@router.get( + "/getSettings", + response_model=List[SettingItem], + tags=["Reslevis"], + dependencies=[Depends(get_current_user)], +) +def getSettings(): + return setting_repo.list() + + +@router.post("/postSetting", tags=["Reslevis"], dependencies=[Depends(get_current_user)]) +def postSetting(item: SettingItem): + setting_repo.add(item) + return {"message": "OK"} + + +@router.put("/updateSetting", tags=["Reslevis"], dependencies=[Depends(get_current_user)]) +def updateSetting(item: SettingItem): + setting_repo.update(item) + return {"message": "OK"} + + +@router.delete("/removeSetting/{setting_id}", tags=["Reslevis"], dependencies=[Depends(get_current_user)]) +def removeSetting(setting_id: str): + setting_repo.remove(setting_id) + return {"message": "OK"} diff --git a/schemas/reslevis.py b/schemas/reslevis.py index 581c50e..3aa630d 100644 --- a/schemas/reslevis.py +++ b/schemas/reslevis.py @@ -59,6 +59,16 @@ class TrackerItem(BaseModel): heartRate: Optional[str] = None buttonPress: Optional[bool] = None +class SettingItem(BaseModel): + id: str + name: str + role: str + unit: int + update: Optional[int] = None + debug: bool + debugFields: Optional[List[str]] = None + language: str + class OperatorItem(BaseModel): id: UUID name: str