From bd31e427158bc8a25519c26e7f1226cf16dd974c Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 16 Jan 2021 23:00:12 +0100
Subject: [PATCH] added route to update sensor name and type

---
 src/logic/database/Crud.py        | 10 ++++++++++
 src/logic/database/Schemas.py     |  5 +++++
 src/logic/routers/SensorRouter.py | 19 +++++++++++++++++++
 3 files changed, 34 insertions(+)

diff --git a/src/logic/database/Crud.py b/src/logic/database/Crud.py
index 5c8ffb7..6b765ad 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 4a535eb..7008268 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 f5ba3ba..e408d37 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.',
-- 
GitLab