From f6ab5b72c59c7d8cca5eff773d10b2b28afc1a03 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 25 Sep 2020 12:58:21 +0200
Subject: [PATCH] delete route for device

---
 docs/api.yml                       | 27 +++++++++++++++++++++++++++
 src/blueprints/Devices.py          | 17 +++++++++++++++++
 src/logic/database/DeviceAccess.py |  4 ++++
 3 files changed, 48 insertions(+)

diff --git a/docs/api.yml b/docs/api.yml
index a9aac3f..e835c62 100644
--- a/docs/api.yml
+++ b/docs/api.yml
@@ -54,6 +54,33 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/Device'
+    delete:
+      tags:
+        - device
+      summary: Deletes a specific device. All correspondig sensors and measurements will be deleted too.
+      operationId: deleteDevice
+      security:
+        - bearerAuth: []
+      parameters:
+        - in: path
+          name: deviceID
+          description: The device 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'
   /device/{deviceID}/sensors:
     get:
       tags:
diff --git a/src/blueprints/Devices.py b/src/blueprints/Devices.py
index 4b8520d..c2088ba 100644
--- a/src/blueprints/Devices.py
+++ b/src/blueprints/Devices.py
@@ -1,5 +1,6 @@
 from flask import Blueprint, jsonify
 
+from logic.AuthenticationWrapper import require_api_key
 from logic.database.Database import Database
 
 
@@ -25,4 +26,20 @@ def construct_blueprint(settings):
 
         return jsonify(database.sensorAccess.get_all_sensors_for_device(deviceID))
 
+    @devices.route('/device/<int:deviceID>', methods=['DELETE'])
+    @require_api_key(password=settings['api']['key'])
+    def delete_device(deviceID):
+        database = Database(settings['database']['databasePath'])
+        if not database.deviceAccess.get_device(deviceID):
+            return jsonify({'success': False, 'msg': f'No device with id "{deviceID}" existing'})
+
+        sensors = database.sensorAccess.get_all_sensors_for_device(deviceID)
+        for sensor in sensors:
+            database.measurementAccess.delete_measurements_for_sensor(sensor['id'])
+            database.sensorAccess.delete_sensor(sensor['id'])
+
+        database.deviceAccess.delete_device(deviceID)
+
+        return jsonify({'success': True})
+
     return devices
diff --git a/src/logic/database/DeviceAccess.py b/src/logic/database/DeviceAccess.py
index f42517e..b2ebc14 100644
--- a/src/logic/database/DeviceAccess.py
+++ b/src/logic/database/DeviceAccess.py
@@ -28,3 +28,7 @@ class DeviceAccess(DatabaseAccess):
     def add_device(self, deviceName: str):
         LOGGER.debug(f'Inserting new device "{deviceName}"')
         self._query(f'INSERT INTO {self.TABLE_NAME}(name) VALUES(?)', deviceName, fetch_type=FetchType.NONE)
+
+    def delete_device(self, deviceID: int):
+        LOGGER.debug(f'Deleting device "{deviceID}"')
+        self._query(f'DELETE FROM {self.TABLE_NAME} WHERE id = ?', deviceID, fetch_type=FetchType.NONE)
-- 
GitLab