diff --git a/src/logic/database/Crud.py b/src/logic/database/Crud.py index 5c8ffb726f9e73a76d750daea9eef57d148def21..6b765ad9da9926de66b630cf43fd3c3561e41daf 100644 --- a/src/logic/database/Crud.py +++ b/src/logic/database/Crud.py @@ -87,6 +87,16 @@ def create_sensor(db: Session, sensor: Schemas.SensorCreate): return dbSensor +@notify_backup_service(BACKUP_SERVICE) +def update_sensor(db: Session, sensorId: int, sensor: Schemas.SensorUpdate): + existingSensor = get_sensor(db, sensorId) + existingSensor.name = sensor.name + existingSensor.type = sensor.type + db.commit() + db.refresh(existingSensor) + return existingSensor + + @notify_backup_service(BACKUP_SERVICE) def delete_sensor(db: Session, sensor: Schemas.Sensor): db.delete(sensor) diff --git a/src/logic/database/Schemas.py b/src/logic/database/Schemas.py index 4a535eb659ebda2b0557b234c789fe47394a4243..7008268b7335123f22c2f014af5c2107da6f1de2 100644 --- a/src/logic/database/Schemas.py +++ b/src/logic/database/Schemas.py @@ -61,6 +61,11 @@ class SensorCreate(BaseModel): deviceId: int +class SensorUpdate(BaseModel): + name: str + type: str + + class Sensor(SensorBase): id: int name: str diff --git a/src/logic/routers/SensorRouter.py b/src/logic/routers/SensorRouter.py index f5ba3bab5376c7e7625637289a1e34afef34fc4a..e408d374d20f084c153c0f33e3c839dff54935b2 100644 --- a/src/logic/routers/SensorRouter.py +++ b/src/logic/routers/SensorRouter.py @@ -49,6 +49,25 @@ async def create_sensor(sensor: Schemas.SensorCreate, db: Session = Depends(get_ return Crud.create_sensor(db=db, sensor=sensor) +@router.put('/{sensorId}', response_model=Schemas.Sensor, + summary='Updates a sensor', + responses={404: {'description': 'Sensor not found'}}, + dependencies=[Depends(check_api_key)]) +async def update_device(sensorId: int, sensor: Schemas.SensorUpdate, db: Session = Depends(get_database)): + sensorToUpdate = Crud.get_sensor(db, sensorId) + if not sensorToUpdate: + raise HTTPException(status_code=404, detail='Sensor not found') + + if sensorToUpdate.name != sensor.name: + existingSensor = Crud.get_sensor_by_name_and_device_id(db, sensor.name, sensorToUpdate.deviceId) + if existingSensor: + raise HTTPException(status_code=400, + detail=f'A sensor called "{sensor.name}" already exists ' + f'(ID: {existingSensor.id}) for device {sensorToUpdate.deviceId}') + + return Crud.update_sensor(db=db, sensorId=sensorId, sensor=sensor) + + @router.delete('/{sensorId}', response_model=Status, summary='Deletes a specific sensor', description='All corresponding measurements will be deleted too.',