from threading import Lock from app.models.schemas import DeviceState class DeviceStore: def __init__(self) -> None: self._devices: dict[str, DeviceState] = {} self._acks: dict[str, list[dict]] = {} self._events: dict[str, list[dict]] = {} self._lock = Lock() def update_state(self, device_id: str, payload: dict, timestamp: int) -> DeviceState: with self._lock: state = DeviceState( device_id=device_id, cpu=payload.get("cpu"), mem=payload.get("mem"), battery=payload.get("battery"), net=payload.get("net"), mode=payload.get("mode"), last_seen=timestamp, ) self._devices[device_id] = state return state def record_ack(self, device_id: str, payload: dict) -> None: with self._lock: self._acks.setdefault(device_id, []).append(payload) def record_event(self, device_id: str, payload: dict) -> None: with self._lock: self._events.setdefault(device_id, []).append(payload) def get_device(self, device_id: str) -> DeviceState | None: return self._devices.get(device_id) def list_devices(self) -> list[DeviceState]: return list(self._devices.values()) def get_acks(self, device_id: str) -> list[dict]: return list(self._acks.get(device_id, [])) def get_events(self, device_id: str) -> list[dict]: return list(self._events.get(device_id, []))