diff --git a/src/StorageLeaf.py b/src/StorageLeaf.py index 37a78ccd9271e2bffb38ab84aa1582aec5e8610c..c25acfd8695a239570e26a3522f73e415371cf63 100644 --- a/src/StorageLeaf.py +++ b/src/StorageLeaf.py @@ -3,7 +3,7 @@ import os from TheCodeLabs_BaseUtils.DefaultLogger import DefaultLogger from TheCodeLabs_FlaskUtils.FlaskBaseApp import FlaskBaseApp -from blueprints import Routes, Devices +from blueprints import Routes, Devices, Sensors, Measurements from logic import Constants LOGGER = DefaultLogger().create_logger_if_not_exists(Constants.APP_NAME) @@ -16,7 +16,8 @@ class StorageLeaf(FlaskBaseApp): def _register_blueprints(self, app): app.register_blueprint(Routes.construct_blueprint(self._settings, self._version)) app.register_blueprint(Devices.construct_blueprint(self._settings)) - + app.register_blueprint(Sensors.construct_blueprint(self._settings)) + app.register_blueprint(Measurements.construct_blueprint(self._settings)) return app diff --git a/src/blueprints/Devices.py b/src/blueprints/Devices.py index be7abb94f05b7d726a7eb2cfdd33e5e527983424..370884eb6698e890a8bb7077f150a60b1d87db59 100644 --- a/src/blueprints/Devices.py +++ b/src/blueprints/Devices.py @@ -1,19 +1,8 @@ -from enum import Enum - from flask import Blueprint, jsonify from logic.Database import Database -class DeviceParameters(Enum): - DEVICE = 'device' - SENSORS = 'sensors' - - @staticmethod - def get_values(): - return [m.value for m in DeviceParameters] - - def construct_blueprint(settings): devices = Blueprint('devices', __name__) diff --git a/src/blueprints/Measurements.py b/src/blueprints/Measurements.py new file mode 100644 index 0000000000000000000000000000000000000000..fe9cae4afcfbd49376385e457e404af08fdc85eb --- /dev/null +++ b/src/blueprints/Measurements.py @@ -0,0 +1,59 @@ +from typing import Dict + +from flask import Blueprint, jsonify, request + +from logic.AuthenticationWrapper import require_api_key +from logic.Database import Database +from logic.Parameters import DeviceParameters, SensorParameters +from logic.RequestValidator import RequestValidator, ValidationError + + +def construct_blueprint(settings): + measurements = Blueprint('measurements', __name__) + + @measurements.route('/measurements', methods=['GET']) + def get_all_measurements(): + database = Database(settings['database']['databasePath']) + return jsonify(database.measurementAccess.get_all_measurements()) + + @measurements.route('/measurement/<int:measurementID>', methods=['GET']) + def get_measurement(measurementID): + database = Database(settings['database']['databasePath']) + return jsonify(database.measurementAccess.get_measurement(measurementID)) + + @measurements.route('/measurements', methods=['POST']) + @require_api_key(password=settings['api']['key']) + def addMeasurement(): + try: + parameters = RequestValidator.validate(request, DeviceParameters.get_values()) + database = Database(settings['database']['databasePath']) + + deviceName = parameters[DeviceParameters.DEVICE.value] + if not database.deviceAccess.get_device_by_name(deviceName): + database.deviceAccess.add_device(deviceName) + device = database.deviceAccess.get_device_by_name(deviceName) + + sensors = parameters[DeviceParameters.SENSORS.value] + for sensor in sensors: + sensorParams = RequestValidator.validate_parameters(sensor, + SensorParameters.get_values(), + f'sensor "{sensor}"') + sensor = __add_sensor_if_not_exists(database, int(device['id']), sensorParams) + database.measurementAccess.add_measurement(int(sensor['id']), + sensorParams[SensorParameters.VALUE.value]) + except ValidationError as e: + return e.response, 400 + + return jsonify({'success': True}) + + def __add_sensor_if_not_exists(database: Database, deviceID: int, sensorParams: Dict) -> Dict[str, str]: + sensorName = sensorParams[SensorParameters.NAME.value] + sensorType = sensorParams[SensorParameters.TYPE.value] + sensor = database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName) + if sensor: + return sensor + + database.sensorAccess.add_sensor(deviceID, sensorName, sensorType) + return database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName) + + return measurements diff --git a/src/blueprints/Routes.py b/src/blueprints/Routes.py index 52bd876c7bb3f1385928b168ba07aede56b9d035..3899f462aa7ac3a164c49794d9ad11a0113d6742 100644 --- a/src/blueprints/Routes.py +++ b/src/blueprints/Routes.py @@ -1,15 +1,10 @@ import json import os -from enum import Enum -from typing import Dict import yaml -from flask import Blueprint, request, jsonify, render_template +from flask import Blueprint, render_template from logic import Constants -from logic.AuthenticationWrapper import require_api_key -from logic.Database import Database -from logic.RequestValidator import ValidationError, RequestValidator def construct_blueprint(settings, version): @@ -29,49 +24,4 @@ def construct_blueprint(settings, version): appName=Constants.APP_NAME, openApiSpecification=specification) - @routes.route('/measurements', methods=['GET']) - def get_all_measurements(): - database = Database(settings['database']['databasePath']) - return jsonify(database.measurementAccess.get_all_measurements()) - - @routes.route('/measurement/<int:measurementID>', methods=['GET']) - def get_measurement(measurementID): - database = Database(settings['database']['databasePath']) - return jsonify(database.measurementAccess.get_measurement(measurementID)) - - @routes.route('/measurements', methods=['POST']) - @require_api_key(password=settings['api']['key']) - def addMeasurement(): - try: - parameters = RequestValidator.validate(request, DeviceParameters.get_values()) - database = Database(settings['database']['databasePath']) - - deviceName = parameters[DeviceParameters.DEVICE.value] - if not database.deviceAccess.get_device_by_name(deviceName): - database.deviceAccess.add_device(deviceName) - device = database.deviceAccess.get_device_by_name(deviceName) - - sensors = parameters[DeviceParameters.SENSORS.value] - for sensor in sensors: - sensorParams = RequestValidator.validate_parameters(sensor, - SensorParameters.get_values(), - f'sensor "{sensor}"') - sensor = __add_sensor_if_not_exists(database, int(device['id']), sensorParams) - database.measurementAccess.add_measurement(int(sensor['id']), - sensorParams[SensorParameters.VALUE.value]) - except ValidationError as e: - return e.response, 400 - - return jsonify({'success': True}) - - def __add_sensor_if_not_exists(database: Database, deviceID: int, sensorParams: Dict) -> Dict[str, str]: - sensorName = sensorParams[SensorParameters.NAME.value] - sensorType = sensorParams[SensorParameters.TYPE.value] - sensor = database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName) - if sensor: - return sensor - - database.sensorAccess.add_sensor(deviceID, sensorName, sensorType) - return database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName) - return routes diff --git a/src/blueprints/Sensors.py b/src/blueprints/Sensors.py index ca44d04a8b8a31de3882b2f696d08fcf0d51bba3..34cff35c5d210d46bca90ca9ae0be9b7e8ae7cf7 100644 --- a/src/blueprints/Sensors.py +++ b/src/blueprints/Sensors.py @@ -1,20 +1,8 @@ -from enum import Enum - from flask import Blueprint, jsonify from logic.Database import Database -class SensorParameters(Enum): - NAME = 'name' - TYPE = 'type' - VALUE = 'value' - - @staticmethod - def get_values(): - return [m.value for m in SensorParameters] - - def construct_blueprint(settings): sensors = Blueprint('sensors', __name__) diff --git a/src/logic/Parameters.py b/src/logic/Parameters.py new file mode 100644 index 0000000000000000000000000000000000000000..4b0ea0036ce0a03d4831e38efbe920ef71f3815a --- /dev/null +++ b/src/logic/Parameters.py @@ -0,0 +1,20 @@ +from enum import Enum + + +class DeviceParameters(Enum): + DEVICE = 'device' + SENSORS = 'sensors' + + @staticmethod + def get_values(): + return [m.value for m in DeviceParameters] + + +class SensorParameters(Enum): + NAME = 'name' + TYPE = 'type' + VALUE = 'value' + + @staticmethod + def get_values(): + return [m.value for m in SensorParameters]