Add date filter stub
This commit is contained in:
70
api-customer/src/controllers/telemetryController.py
Normal file
70
api-customer/src/controllers/telemetryController.py
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user