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