| @@ -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" | |||
| @@ -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) | |||
| @@ -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"} | |||
| @@ -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 | |||