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