From 788db09b599894a1d07f757ec257768df79e4d48 Mon Sep 17 00:00:00 2001 From: Lloyd Date: Mon, 24 Nov 2025 21:27:12 +0000 Subject: [PATCH] feat: add delete advert functionality to SQLiteHandler and API endpoints --- config.yaml.example | 5 -- repeater/data_acquisition/sqlite_handler.py | 9 ++++ .../data_acquisition/storage_collector.py | 3 ++ repeater/web/api_endpoints.py | 47 ++++++++++++++++++- 4 files changed, 58 insertions(+), 6 deletions(-) diff --git a/config.yaml.example b/config.yaml.example index 1b7cab3..61b7bd6 100644 --- a/config.yaml.example +++ b/config.yaml.example @@ -41,11 +41,6 @@ mesh: # Individual transport keys can override this setting global_flood_allow: true - # Identity key for mesh network (auto-generated if not provided) - # This is automatically managed - leave as null for automatic generation - identity_key: null - - radio: # Frequency in Hz (869.618 MHz for EU) frequency: 869618000 diff --git a/repeater/data_acquisition/sqlite_handler.py b/repeater/data_acquisition/sqlite_handler.py index ac4babf..f41c36b 100644 --- a/repeater/data_acquisition/sqlite_handler.py +++ b/repeater/data_acquisition/sqlite_handler.py @@ -812,4 +812,13 @@ class SQLiteHandler: return cursor.rowcount > 0 except Exception as e: logger.error(f"Failed to delete transport key: {e}") + return False + + def delete_advert(self, advert_id: int) -> bool: + try: + with sqlite3.connect(self.sqlite_path) as conn: + cursor = conn.execute("DELETE FROM adverts WHERE id = ?", (advert_id,)) + return cursor.rowcount > 0 + except Exception as e: + logger.error(f"Failed to delete advert: {e}") return False \ No newline at end of file diff --git a/repeater/data_acquisition/storage_collector.py b/repeater/data_acquisition/storage_collector.py index 529865f..02b7ea6 100644 --- a/repeater/data_acquisition/storage_collector.py +++ b/repeater/data_acquisition/storage_collector.py @@ -225,3 +225,6 @@ class StorageCollector: def delete_transport_key(self, key_id: int) -> bool: return self.sqlite_handler.delete_transport_key(key_id) + + def delete_advert(self, advert_id: int) -> bool: + return self.sqlite_handler.delete_advert(advert_id) diff --git a/repeater/web/api_endpoints.py b/repeater/web/api_endpoints.py index 1d27345..ddc7630 100644 --- a/repeater/web/api_endpoints.py +++ b/repeater/web/api_endpoints.py @@ -855,4 +855,49 @@ class APIEndpoints: logger.error(f"Error updating global flood policy: {e}") return self._error(e) else: - return self._error("Method not supported") \ No newline at end of file + return self._error("Method not supported") + + @cherrypy.expose + @cherrypy.tools.json_out() + @cherrypy.tools.json_in() + def advert(self, advert_id): + if cherrypy.request.method == "DELETE": + try: + advert_id = int(advert_id) + storage = self._get_storage() + success = storage.delete_advert(advert_id) + + if success: + return self._success({"id": advert_id}, message="Neighbor deleted successfully") + else: + return self._error("Failed to delete neighbor or neighbor not found") + except ValueError: + return self._error("Invalid advert_id format") + except Exception as e: + logger.error(f"Error deleting neighbor: {e}") + return self._error(e) + else: + return self._error("Method not supported") + + @cherrypy.expose + @cherrypy.tools.json_out() + @cherrypy.tools.json_in() + def ping_neighbor(self): + try: + self._require_post() + data = cherrypy.request.json or {} + target_id = data.get("target_id") + + if not target_id: + return self._error("Missing target_id parameter") + + # TODO: Implement actual ping functionality when available + # For now, return success to indicate the endpoint works + logger.info(f"Ping request for neighbor: {target_id}") + return self._success({"target_id": target_id}, message="Ping sent successfully") + + except cherrypy.HTTPError: + raise + except Exception as e: + logger.error(f"Error pinging neighbor: {e}") + return self._error(e) \ No newline at end of file