diff --git a/docs/api.yml b/docs/api.yml index 4d8a12f78a294f00a1c1d4019c49ed737a2a3efd..a9aac3f46b903e211cb2f4669cf2f33afffdc6bc 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 e9e9f9700498e695733af16f9b261d2eb1d74213..310a65734d0649a8c1ec8725894431a12333eebf 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 e617b0f6262ffe337ba357742c7b4787f738aef4..52651c57b8fa29275eb8129302093cce4a6ae2fd 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 68b3f90f2f5b63f050451459715fbe8bf33dce28..156598037927f667ac45bff800f5c4d85edff342 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)