diff --git a/api-customer/src/controllers/telemetryController.py b/api-customer/src/controllers/telemetryController.py new file mode 100644 index 00000000..dfe63bba --- /dev/null +++ b/api-customer/src/controllers/telemetryController.py @@ -0,0 +1,70 @@ +from datetime import datetime + +from flask import request, jsonify + +from src.models import logger +from src.services.mongo_service import MongoService + + +class TelemetryController: + + _database_service : MongoService = None + + def __init__(self, app, database_service : MongoService): + self._register_routes(app) + + def _register_routes(self, app): + app.add_url_rule("/telemetry/history/sound", view_func=self.sound, methods=['GET']) + app.add_url_rule("/telemetry/history/light", view_func=self.light, methods=['GET']) + app.add_url_rule("/telemetry/history/gps", view_func=self.gps, methods=['GET']) + + def sound(self): + try: + odata_filter = request.args.get("$filter") + start_date, end_date = self._extract_dates_from_odata(odata_filter) + return self._database_service.find_by_date("telemetry", start_date, end_date) + except Exception as e: + logger.log_info(e) + + def light(self): + try: + odata_filter = request.args.get("$filter") + start_date, end_date = self._extract_dates_from_odata(odata_filter) + return self._database_service.find_by_date("telemetry", start_date, end_date) + except Exception as e: + logger.log_info(e) + + def gps(self): + try: + odata_filter = request.args.get("$filter") + start_date, end_date = self._extract_dates_from_odata(odata_filter) + return self._database_service.find_by_date("telemetry", start_date, end_date) + except Exception as e: + logger.log_info(e) + + def _extract_dates_from_odata(self, filter_str): + + start_date = None + end_date = None + + if not filter_str: + return start_date, end_date + + conditions = filter_str.split("and") + for cond in conditions: + parts = cond.strip().split() + if len(parts) != 3: + continue + + field, operator, value = parts + try: + dt = datetime.fromisoformat(value) + except ValueError: + continue + + if operator == "ge": + start_date = dt + elif operator == "le": + end_date = dt + + return start_date, end_date diff --git a/api-customer/src/services/mongo_service.py b/api-customer/src/services/mongo_service.py index 9a354010..3e133311 100644 --- a/api-customer/src/services/mongo_service.py +++ b/api-customer/src/services/mongo_service.py @@ -1,4 +1,5 @@ import json +from datetime import datetime from pymongo import MongoClient from pymongo.synchronous.database import Database @@ -27,13 +28,31 @@ class MongoService: except Exception as e: logger.log_info(e) - def find(self, collection: str, field: str, value): + def find_by_value(self, collection: str, field: str, value): try : collection = self._db[collection] return list(collection.find({field: value})) except Exception as e: logger.log_info(e) + def find_by_date(self, collection: str, filters: dict = None, timestamp_field: str = "created_at", + start_time: datetime = None, end_time: datetime = None): + try: + collection = self._db[collection] + query = filters.copy() if filters else {} + + if start_time or end_time: + query[timestamp_field] = {} + if start_time: + query[timestamp_field]["$gte"] = start_time + if end_time: + query[timestamp_field]["$lte"] = end_time + + return list(collection.find(query)) + except Exception as e: + logger.log_info(e) + return [] + def _to_document(self, obj): if obj is None or isinstance(obj, (str, int, float, bool)): return obj