From 851a6f39f2834ec320c7cf3d68e2797927b964de Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 25 Sep 2020 12:54:52 +0200
Subject: [PATCH] delete route for sensor

---
 docs/api.yml                            | 27 +++++++++++++++++++++++++
 src/blueprints/Sensors.py               | 16 +++++++++++++--
 src/logic/database/MeasurementAccess.py |  3 +++
 src/logic/database/SensorAccess.py      |  8 ++++++--
 4 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/docs/api.yml b/docs/api.yml
index 4d8a12f..a9aac3f 100644
--- a/docs/api.yml
+++ b/docs/api.yml
@@ -112,6 +112,33 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/Sensor'
+    delete:
+      tags:
+        - sensor
+      summary: Deletes a specific sensor. All correspondig measurements will be deleted too.
+      operationId: deleteSensor
+      security:
+        - bearerAuth: []
+      parameters:
+        - in: path
+          name: sensorID
+          description: The sensor id
+          required: true
+          schema:
+            type: integer
+      responses:
+        '200':
+          description: success response
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/SuccessResponse'
+          default:
+            description: error response
+            content:
+              application/json:
+                schema:
+                  $ref: '#/components/schemas/ErrorResponse'
   /sensor/{sensorID}/measurements:
     get:
       tags:
diff --git a/src/blueprints/Sensors.py b/src/blueprints/Sensors.py
index e9e9f97..310a657 100644
--- a/src/blueprints/Sensors.py
+++ b/src/blueprints/Sensors.py
@@ -1,5 +1,6 @@
 from flask import Blueprint, jsonify
 
+from logic.AuthenticationWrapper import require_api_key
 from logic.database.Database import Database
 
 
@@ -16,7 +17,7 @@ def construct_blueprint(settings):
         database = Database(settings['database']['databasePath'])
         return jsonify(database.sensorAccess.get_sensor(sensorID))
 
-    @sensors.route('/sensor/<sensorID>/measurements', methods=['GET'])
+    @sensors.route('/sensor/<int:sensorID>/measurements', methods=['GET'])
     def get_all_measurements_for_sensor(sensorID):
         database = Database(settings['database']['databasePath'])
         sensor = database.sensorAccess.get_sensor(sensorID)
@@ -25,7 +26,7 @@ def construct_blueprint(settings):
 
         return jsonify(database.measurementAccess.get_all_measurements_for_sensor(sensorID))
 
-    @sensors.route('/sensor/<sensorID>/measurements/latest', methods=['GET'])
+    @sensors.route('/sensor/<int:sensorID>/measurements/latest', methods=['GET'])
     def get_latest_measurements_for_sensor(sensorID):
         database = Database(settings['database']['databasePath'])
         sensor = database.sensorAccess.get_sensor(sensorID)
@@ -34,4 +35,15 @@ def construct_blueprint(settings):
 
         return jsonify(database.measurementAccess.get_latest_measurements_for_sensor(sensorID))
 
+    @sensors.route('/sensor/<int:sensorID>', methods=['DELETE'])
+    @require_api_key(password=settings['api']['key'])
+    def delete_sensor(sensorID):
+        database = Database(settings['database']['databasePath'])
+        if not database.sensorAccess.get_sensor(sensorID):
+            return jsonify({'success': False, 'msg': f'No sensor with id "{sensorID}" existing'})
+
+        database.measurementAccess.delete_measurements_for_sensor(sensorID)
+        database.sensorAccess.delete_sensor(sensorID)
+        return jsonify({'success': True})
+
     return sensors
diff --git a/src/logic/database/MeasurementAccess.py b/src/logic/database/MeasurementAccess.py
index e617b0f..52651c5 100644
--- a/src/logic/database/MeasurementAccess.py
+++ b/src/logic/database/MeasurementAccess.py
@@ -53,3 +53,6 @@ class MeasurementAccess(DatabaseAccess):
         LOGGER.debug(f'Deleting measurement "{measurementID}"')
         self._query(f'DELETE FROM {self.TABLE_NAME} WHERE id = ?', measurementID, fetch_type=FetchType.NONE)
 
+    def delete_measurements_for_sensor(self, sensorID: int):
+        LOGGER.debug(f'Deleting all measurement for sensor "{sensorID}"')
+        self._query(f'DELETE FROM {self.TABLE_NAME} WHERE sensor_id = ?', sensorID, fetch_type=FetchType.NONE)
diff --git a/src/logic/database/SensorAccess.py b/src/logic/database/SensorAccess.py
index 68b3f90..1565980 100644
--- a/src/logic/database/SensorAccess.py
+++ b/src/logic/database/SensorAccess.py
@@ -19,10 +19,10 @@ class SensorAccess(DatabaseAccess):
                          type TEXT NOT NULL)''', fetch_type=FetchType.NONE)
 
     def get_all_sensors(self) -> List[Dict[str, str]]:
-        return self._query(f'SELECT * FROM {self.TABLE_NAME} ORDER BY device_id, name', fetch_type=FetchType.ALL)
+        return self._query(f'SELECT * FROM {self.TABLE_NAME} ORDER BY device_id, id', fetch_type=FetchType.ALL)
 
     def get_all_sensors_for_device(self, deviceID: int) -> List[Dict[str, str]]:
-        return self._query(f'SELECT * FROM {self.TABLE_NAME} WHERE device_id = ? ORDER BY name',
+        return self._query(f'SELECT * FROM {self.TABLE_NAME} WHERE device_id = ? ORDER BY id',
                            deviceID,
                            fetch_type=FetchType.ALL)
 
@@ -42,3 +42,7 @@ class SensorAccess(DatabaseAccess):
                     f'VALUES(?, ?, ?)',
                     name, deviceID, sensorType,
                     fetch_type=FetchType.NONE)
+
+    def delete_sensor(self, sensorID: int):
+        LOGGER.debug(f'Deleting sensor "{sensorID}"')
+        self._query(f'DELETE FROM {self.TABLE_NAME} WHERE id = ?', sensorID, fetch_type=FetchType.NONE)
-- 
GitLab