diff --git a/src/Dependencies.py b/src/Dependencies.py index 1293c4753f6833e3d7f5294f04e7df5fdc33fdaa..025d430515cac449ab4becc760fa07e9f5c41552 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 711864fe86d211900655b0dc97bc3f7b1eabe79b..3075ae39eafc80bd3b51ef42fddbcbdf58a57a1b 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 9286d75d60586e575c7f2a5c18f56a22e6ab723c..9905b1a0cb1c082eb3c78ceacc881643afa492d3 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)