From 769d30dc588aa8f0ed69dc71aa9df89097a282aa Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 16 Jan 2021 18:49:19 +0100
Subject: [PATCH] added route to retrieve min/max values for given sensor ids

---
 src/Dependencies.py              |  4 ++--
 src/logic/databaseNew/Schemas.py |  5 +++++
 src/routers/MeasurementRouter.py | 36 +++++++++++++++++++++++---------
 3 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/src/Dependencies.py b/src/Dependencies.py
index 1293c47..025d430 100644
--- a/src/Dependencies.py
+++ b/src/Dependencies.py
@@ -25,7 +25,7 @@ async def check_api_key(apiKey: str = Security(API_KEY_HEADER)):
         raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail='apiKey invalid')
 
 
-START_DATE_TIME: str = Query('2021-01-16 18:15:22',
+START_DATE_TIME: str = Query(default='2021-01-16 18:15:22',
                              description='The start date and time of the date range that should be taken into account.')
-END_DATE_TIME: str = Query('2021-01-16 19:15:22',
+END_DATE_TIME: str = Query(default='2021-01-16 19:15:22',
                            description='The end date and time of the date range that should be taken into account.')
diff --git a/src/logic/databaseNew/Schemas.py b/src/logic/databaseNew/Schemas.py
index 711864f..3075ae3 100644
--- a/src/logic/databaseNew/Schemas.py
+++ b/src/logic/databaseNew/Schemas.py
@@ -7,6 +7,11 @@ class Status(BaseModel):
     message: str
 
 
+class MinMax(BaseModel):
+    min: float or None
+    max: float or None
+
+
 # ===== measurement =====
 class Measurement(BaseModel):
     id: int
diff --git a/src/routers/MeasurementRouter.py b/src/routers/MeasurementRouter.py
index 9286d75..9905b1a 100644
--- a/src/routers/MeasurementRouter.py
+++ b/src/routers/MeasurementRouter.py
@@ -1,19 +1,16 @@
 from typing import List
 
-from fastapi import APIRouter, HTTPException, Depends
+from fastapi import APIRouter, HTTPException, Depends, Query
 from sqlalchemy.orm import Session
 
 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
+from logic.databaseNew.Schemas import Status, MinMax
 
-router = APIRouter(
-    prefix='/measurement',
-    tags=['measurement']
-)
+router = APIRouter(tags=['measurement'])
 
 
-@router.get('/', response_model=List[Schemas.Measurement],
+@router.get('/measurement', response_model=List[Schemas.Measurement],
             summary='Gets all measurements',
             description='Number of results can be limited by specifying a date range')
 async def read_measurements(startDateTime: str = START_DATE_TIME,
@@ -22,7 +19,7 @@ async def read_measurements(startDateTime: str = START_DATE_TIME,
     return Crud.get_measurements(db, startDateTime=startDateTime, endDateTime=endDateTime)
 
 
-@router.get('/{measurementId}', response_model=Schemas.Measurement,
+@router.get('/measurement/{measurementId}', response_model=Schemas.Measurement,
             summary='Gets a specific measurement',
             responses={404: {'description': 'Measurement not found'}})
 async def read_measurement(measurementId: int, db: Session = Depends(get_database)):
@@ -32,7 +29,7 @@ async def read_measurement(measurementId: int, db: Session = Depends(get_databas
     return measurement
 
 
-@router.post('/', response_model=Schemas.Measurement,
+@router.post('/measurement/', response_model=Schemas.Measurement,
              summary='Adds a new measurement',
              responses={404: {'description': 'No sensor with id "{measurement.sensorId}" existing'}},
              dependencies=[Depends(check_api_key)])
@@ -44,7 +41,7 @@ async def create_measurement(measurement: Schemas.MeasurementCreate, db: Session
     return Crud.create_measurement(db=db, measurement=measurement)
 
 
-@router.delete('/{measurementId}', response_model=Status,
+@router.delete('/measurement/{measurementId}', response_model=Status,
                summary='Deletes a specific measurementId',
                responses={404: {'description': 'Measurement not found'}},
                dependencies=[Depends(check_api_key)])
@@ -55,3 +52,22 @@ async def delete_measurement(measurementId: int, db: Session = Depends(get_datab
 
     Crud.delete_measurement(db, measurement)
     return Status(message=f'Deleted measurement {measurement.id}')
+
+
+@router.get('/measurements/minMax', response_model=Schemas.MinMax,
+            summary='Gets the minimum and maximum values for the given sensor ids',
+            description='Number of checked values can be limited by specifying a date range')
+async def get_min_and_max_for_sensor_ids(sensorIds: List[int] = Query(None),
+                                         startDateTime: str = START_DATE_TIME,
+                                         endDateTime: str = END_DATE_TIME,
+                                         db: Session = Depends(get_database)):
+    values = []
+    for sensorId in sensorIds:
+        measurementsForSensor = Crud.get_measurements_for_sensor(db, startDateTime, endDateTime, sensorId)
+        for measurement in measurementsForSensor:
+            values.append(float(measurement.value))
+
+    if values:
+        return MinMax(min=min(values), max=max(values))
+
+    return MinMax(min=None, max=None)
-- 
GitLab