feat: add server-side device deletion

- add portal API and UI action to delete non-default devices
- protect the configured portal default device from deletion
- document that trip/history pages still scope to the single DEVICE_NAME

Co-authored-by: Copilot <[email protected]>
This commit is contained in:
Mathieu Moran
2026-08-10 18:09:15 -04:00
co-authored by Copilot
parent 690cf0a5d4
commit 675bffb4a4
6 changed files with 78 additions and 0 deletions
+7
View File
@@ -187,6 +187,13 @@ def acknowledge_device_sync(device_id, config_version):
)
def delete_device(device_id):
with get_cursor(commit=True) as cur:
cur.execute("DELETE FROM devices WHERE id = %s RETURNING id", (device_id,))
row = cur.fetchone()
return row[0] if row else None
def insert_tracking_points(device_id, points):
"""Bulk-insert tracking points, skipping any that already exist
(device_id, recorded_at) so a client can safely re-send a batch after a
+15
View File
@@ -63,6 +63,21 @@ def request_sync(device_id):
}
def delete_device(device_id, protected_device_name=None):
device = db.get_device_by_id(device_id)
if device is None:
return False, {"error": "Device not found."}
if protected_device_name and device["name"] == protected_device_name:
return False, {
"error": "Cannot delete the portal's default device while DEVICE_NAME still points to it.",
}
deleted_id = db.delete_device(device_id)
if deleted_id is None:
return False, {"error": "Device not found."}
return True, {}
def acknowledge_sync(device_id, config_version):
db.acknowledge_device_sync(device_id, config_version)