From e44f1e1e4e4c8794825b1698d83a82366a070dc6 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 16 Jan 2021 18:13:49 +0100
Subject: [PATCH] added route to retrieve latest measurement of a specific
 sensor

---
 src/logic/database/MeasurementAccess.py | 45 +------------------------
 src/logic/databaseNew/Crud.py           |  7 ++++
 src/routers/SensorRouter.py             | 10 ++++++
 3 files changed, 18 insertions(+), 44 deletions(-)

diff --git a/src/logic/database/MeasurementAccess.py b/src/logic/database/MeasurementAccess.py
index d994f81..227873d 100644
--- a/src/logic/database/MeasurementAccess.py
+++ b/src/logic/database/MeasurementAccess.py
@@ -1,6 +1,5 @@
 import logging
-from datetime import datetime
-from typing import Dict, List
+from typing import Dict
 
 from logic import Constants
 from logic.database.DatabaseAccess import DatabaseAccess, FetchType
@@ -9,50 +8,8 @@ LOGGER = logging.getLogger(Constants.APP_NAME)
 
 
 class MeasurementAccess(DatabaseAccess):
-    TABLE_NAME = 'measurement'
-
-    def create_table(self):
-        self._query(f'''CREATE TABLE IF NOT EXISTS {self.TABLE_NAME} (
-                         id INTEGER PRIMARY KEY AUTOINCREMENT,
-                         sensor_id INTEGER,
-                         value TEXT NOT NULL,
-                         timestamp TEXT NOT NULL)''', fetch_type=FetchType.CREATE)
-
-    def __get_current_datetime(self):
-        return datetime.strftime(datetime.now(), self.DATE_FORMAT)
-
-    def get_all_measurements(self, startDateTime: str, endDateTime: str) -> List[Dict[str, str]]:
-        if startDateTime and endDateTime:
-            return self._query(f'SELECT * FROM {self.TABLE_NAME} WHERE '
-                               f'DATETIME(timestamp) BETWEEN DATETIME(?) AND DATETIME(?) '
-                               f'ORDER BY sensor_id ASC, datetime(timestamp) DESC',
-                               startDateTime,
-                               endDateTime,
-                               fetch_type=FetchType.ALL)
-
-        return self._query(f'SELECT * FROM {self.TABLE_NAME} ORDER BY sensor_id ASC, '
-                           f'datetime(timestamp) DESC',
-                           fetch_type=FetchType.ALL)
-
-    def get_all_measurements_for_sensor(self, sensorID: int,
-                                        startDateTime: str,
-                                        endDateTime: str) -> List[Dict[str, str]]:
-        if startDateTime and endDateTime:
-            return self._query(f'SELECT * FROM {self.TABLE_NAME} WHERE sensor_id = ? '
-                               f'AND DATETIME(timestamp) BETWEEN DATETIME(?) AND DATETIME(?) '
-                               f'ORDER BY datetime(timestamp) DESC',
-                               sensorID,
-                               startDateTime,
-                               endDateTime,
-                               fetch_type=FetchType.ALL)
-
-        return self._query(f'SELECT * FROM {self.TABLE_NAME} WHERE sensor_id = ? ORDER BY datetime(timestamp) DESC',
-                           sensorID,
-                           fetch_type=FetchType.ALL)
-
     def get_latest_measurements_for_sensor(self, sensorID: int) -> Dict[str, str] or None:
         return self._query(f'SELECT * FROM {self.TABLE_NAME} WHERE sensor_id = ? '
                            f'ORDER BY datetime(timestamp) DESC LIMIT 1',
                            sensorID,
                            fetch_type=FetchType.ONE)
-
diff --git a/src/logic/databaseNew/Crud.py b/src/logic/databaseNew/Crud.py
index 9dca2e4..2849942 100644
--- a/src/logic/databaseNew/Crud.py
+++ b/src/logic/databaseNew/Crud.py
@@ -83,6 +83,13 @@ def get_measurements_for_sensor(db: Session, startDateTime: str, endDateTime: st
     return db.query(Models.Measurement).filter(Models.Measurement.sensorId == sensorId).all()
 
 
+def get_latest_measurement_for_sensor(db: Session, sensorId: int):
+    return db.query(Models.Measurement) \
+        .filter(Models.Measurement.sensorId == sensorId) \
+        .order_by(Models.Measurement.timestamp.desc()) \
+        .first()
+
+
 def get_measurement(db: Session, measurementId: int):
     return db.query(Models.Measurement).filter(Models.Measurement.id == measurementId).first()
 
diff --git a/src/routers/SensorRouter.py b/src/routers/SensorRouter.py
index 272c305..66a5375 100644
--- a/src/routers/SensorRouter.py
+++ b/src/routers/SensorRouter.py
@@ -75,3 +75,13 @@ async def get_sensor_measurements(sensorId: int,
     if sensor is None:
         raise HTTPException(status_code=404, detail='Sensor not found')
     return Crud.get_measurements_for_sensor(db, startDateTime, endDateTime, sensorId)
+
+
+@router.get('/{sensorId}/measurements/latest', response_model=Schemas.Measurement,
+            summary='Gets the latest measurement for a specific sensor',
+            responses={404: {'description': 'Sensor not found'}})
+async def get_latest_measurements_for_sensor(sensorId: int, db: Session = Depends(get_database)):
+    sensor = Crud.get_sensor(db, sensorId=sensorId)
+    if sensor is None:
+        raise HTTPException(status_code=404, detail='Sensor not found')
+    return Crud.get_latest_measurement_for_sensor(db, sensorId)
-- 
GitLab