From 2acd44bcf8c6a5e8c44a9d105ff5ee2e1596af50 Mon Sep 17 00:00:00 2001 From: Lloyd Date: Wed, 12 Nov 2025 07:08:09 +0000 Subject: [PATCH] add get_route_stats method to StorageCollector and corresponding API endpoint for packet stats --- repeater/data_acquisition/storage_collector.py | 3 +++ repeater/web/api_endpoints.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/repeater/data_acquisition/storage_collector.py b/repeater/data_acquisition/storage_collector.py index 7aa0647..cf88cd8 100644 --- a/repeater/data_acquisition/storage_collector.py +++ b/repeater/data_acquisition/storage_collector.py @@ -75,6 +75,9 @@ class StorageCollector: logger.warning("Falling back to SQLite for packet type stats") return self.sqlite_handler.get_packet_type_stats(hours) + def get_route_stats(self, hours: int = 24) -> dict: + return self.sqlite_handler.get_route_stats(hours) + def get_neighbors(self) -> dict: return self.sqlite_handler.get_neighbors() diff --git a/repeater/web/api_endpoints.py b/repeater/web/api_endpoints.py index c36eb24..8d2ed4b 100644 --- a/repeater/web/api_endpoints.py +++ b/repeater/web/api_endpoints.py @@ -241,6 +241,18 @@ class APIEndpoints: logger.error(f"Error fetching logs: {e}") return {"error": str(e), "logs": []} + @cherrypy.expose + @cherrypy.tools.json_out() + @cors_enabled + def packet_stats(self, hours=24): + try: + hours = int(hours) + stats = self._get_storage().get_packet_stats(hours=hours) + return self._success(stats) + except Exception as e: + logger.error(f"Error getting packet stats: {e}") + return self._error(e) + @cherrypy.expose @cherrypy.tools.json_out() @cors_enabled @@ -447,6 +459,7 @@ class APIEndpoints: @cherrypy.expose @cherrypy.tools.json_out() @cherrypy.tools.json_in() + @cors_enabled def cad_calibration_start(self): try: self._require_post() @@ -463,6 +476,7 @@ class APIEndpoints: @cherrypy.expose @cherrypy.tools.json_out() + @cors_enabled def cad_calibration_stop(self): try: self._require_post() @@ -475,6 +489,7 @@ class APIEndpoints: @cherrypy.expose @cherrypy.tools.json_out() @cherrypy.tools.json_in() + @cors_enabled def save_cad_settings(self): try: self._require_post()