From e7e15dd469c8f8ecaeb024503aa850514583e727 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 16 Jan 2021 18:07:50 +0100
Subject: [PATCH] added route to retrieve measurements of a specific sensor in
 a given time range

---
 src/logic/databaseNew/Crud.py |  9 +++++++++
 src/routers/SensorRouter.py   | 16 +++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/logic/databaseNew/Crud.py b/src/logic/databaseNew/Crud.py
index f2bcd6a..9dca2e4 100644
--- a/src/logic/databaseNew/Crud.py
+++ b/src/logic/databaseNew/Crud.py
@@ -74,6 +74,15 @@ def get_measurements(db: Session, startDateTime: str, endDateTime: str):
     return db.query(Models.Measurement).all()
 
 
+def get_measurements_for_sensor(db: Session, startDateTime: str, endDateTime: str, sensorId: int):
+    if startDateTime and endDateTime:
+        return db.query(Models.Measurement).filter(and_(startDateTime <= Models.Measurement.timestamp,
+                                                        endDateTime >= Models.Measurement.timestamp,
+                                                        Models.Measurement.sensorId == sensorId)).all()
+
+    return db.query(Models.Measurement).filter(Models.Measurement.sensorId == sensorId).all()
+
+
 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 0ba15e2..272c305 100644
--- a/src/routers/SensorRouter.py
+++ b/src/routers/SensorRouter.py
@@ -3,7 +3,7 @@ from typing import List
 from fastapi import APIRouter, HTTPException, Depends
 from sqlalchemy.orm import Session
 
-from Dependencies import get_database, check_api_key
+from Dependencies import get_database, check_api_key, START_DATE_TIME, END_DATE_TIME
 from logic.databaseNew import Schemas, Crud
 from logic.databaseNew.Schemas import Status
 
@@ -61,3 +61,17 @@ async def delete_sensor(sensorId: int, db: Session = Depends(get_database)):
 
     Crud.delete_sensor(db, sensor)
     return Status(message=f'Deleted sensor {sensor.id}')
+
+
+@router.get('/{sensorId}/measurements', response_model=List[Schemas.Measurement],
+            summary='Gets all measurements for a specific sensor',
+            description='Number of results can be limited by specifying a date range',
+            responses={404: {'description': 'Sensor not found'}})
+async def get_sensor_measurements(sensorId: int,
+                                  startDateTime: str = START_DATE_TIME,
+                                  endDateTime: str = END_DATE_TIME,
+                                  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_measurements_for_sensor(db, startDateTime, endDateTime, sensorId)
-- 
GitLab