From 827830b0438e588e7b2717670893e6f2c481244d Mon Sep 17 00:00:00 2001 From: User Date: Sun, 1 Feb 2026 04:15:36 +0100 Subject: [PATCH] fix: create missing devices during peer sync - bulk_update_devices now creates devices if they don't exist locally but have useful metadata (floor, label, or favorite status) - Sync trigger endpoint now reports both pulled and pushed device counts - Enables full bidirectional sync of device metadata between peers Co-Authored-By: Claude Opus 4.5 --- src/rf_mapper/database.py | 21 ++++++++++++++++++--- src/rf_mapper/web/app.py | 8 +++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/rf_mapper/database.py b/src/rf_mapper/database.py index 2045ee0..657d66b 100644 --- a/src/rf_mapper/database.py +++ b/src/rf_mapper/database.py @@ -1025,9 +1025,24 @@ class DeviceDatabase: if cursor.rowcount > 0: updated_count += 1 else: - # Device doesn't exist locally - we can only sync metadata for - # devices we've seen, so skip unknown devices - pass + # Device doesn't exist locally - create it if it has useful metadata + if dev.get("assigned_floor") is not None or dev.get("custom_label") or dev.get("is_favorite"): + device_type = dev.get("device_type", "bluetooth") + name = dev.get("name") or dev.get("ssid") or device_id + now = datetime.now().isoformat() + + cursor.execute(""" + INSERT INTO devices (device_id, device_type, name, ssid, manufacturer, + custom_label, assigned_floor, is_favorite, notes, + first_seen, last_seen, total_observations, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?) + """, ( + device_id, device_type, name, dev.get("ssid"), dev.get("manufacturer"), + dev.get("custom_label"), dev.get("assigned_floor"), + 1 if dev.get("is_favorite") else 0, dev.get("notes"), + now, now, dev.get("updated_at", now) + )) + updated_count += 1 conn.commit() return updated_count diff --git a/src/rf_mapper/web/app.py b/src/rf_mapper/web/app.py index c103465..a474867 100644 --- a/src/rf_mapper/web/app.py +++ b/src/rf_mapper/web/app.py @@ -1389,12 +1389,14 @@ def create_app(config: Config | None = None) -> Flask: peer_id = peer["scanner_id"] peer_url = peer["url"] try: - updated = peer_sync.sync_devices_from_peer(peer_url) - peer_sync.push_devices_to_peer(peer_url) + pulled = peer_sync.sync_devices_from_peer(peer_url) + push_result = peer_sync.push_devices_to_peer(peer_url) + pushed = push_result.get("updated", 0) if push_result else 0 results.append({ "peer_id": peer_id, "status": "success", - "devices_updated": updated + "devices_pulled": pulled, + "devices_pushed": pushed }) except Exception as e: results.append({