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()