diff --git a/docs/api.yml b/docs/api.yml index 69c23919b43104ddf0cac009db34194d4ef9cdf1..4faa08bc028a0bd314ff0567a204456911e6d43f 100644 --- a/docs/api.yml +++ b/docs/api.yml @@ -285,12 +285,12 @@ paths: post: tags: - measurement - summary: Adds a new measurement. Non-existent device or sensor will be created automatically. - operationId: addMeasurement + summary: Adds multiple measurements. Non-existent device and sensors will be created automatically. + operationId: addMeasurements security: - bearerAuth: [] requestBody: - description: Measurement to add + description: Measurements to add required: true content: application/json: @@ -356,6 +356,34 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorResponse' + /measurement: + post: + tags: + - measurement + summary: Adds a new measurement for the given sensor. + operationId: addMeasurement + security: + - bearerAuth: [] + requestBody: + description: Measurement to add + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NewMeasurement' + 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' components: securitySchemes: @@ -452,10 +480,10 @@ components: type: array items: allOf: - - $ref: '#/components/schemas/NewMeasurement' + - $ref: '#/components/schemas/NewSensorMeasurement' - type: object - NewMeasurement: + NewSensorMeasurement: type: object required: - name @@ -472,6 +500,19 @@ components: type: string example: "20.15" + NewMeasurement: + type: object + required: + - sensor_id + - value + properties: + sensor_id: + type: integer + example: 1 + value: + type: string + example: "20.15" + NewDevice: type: object required: diff --git a/src/blueprints/Measurements.py b/src/blueprints/Measurements.py index 6ddcdf46854768b8c9a948cf42d60ef1e0a24c35..764da8cf628ac976e386c3aaa9fb297e9dd75a94 100644 --- a/src/blueprints/Measurements.py +++ b/src/blueprints/Measurements.py @@ -4,7 +4,7 @@ from flask import Blueprint, jsonify, request from logic.AuthenticationWrapper import require_api_key from logic.database.Database import Database -from logic.Parameters import DeviceParameters, SensorParameters +from logic.Parameters import DeviceParameters, SensorParameters, MeasurementParameters from logic.RequestValidator import RequestValidator, ValidationError @@ -23,7 +23,7 @@ def construct_blueprint(settings): @measurements.route('/measurements', methods=['POST']) @require_api_key(password=settings['api']['key']) - def add_measurement(): + def add_multiple_measurements(): try: parameters = RequestValidator.validate(request, DeviceParameters.get_values()) database = Database(settings['database']['databasePath']) @@ -58,6 +58,23 @@ def construct_blueprint(settings): database.sensorAccess.add_sensor(deviceID, sensorName, sensorType) return database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName) + @measurements.route('/measurement', methods=['POST']) + @require_api_key(password=settings['api']['key']) + def add_single_measurement(): + try: + parameters = RequestValidator.validate(request, MeasurementParameters.get_values()) + database = Database(settings['database']['databasePath']) + + sensorID = parameters[MeasurementParameters.SENSOR_ID.value] + if not database.sensorAccess.get_sensor(sensorID): + return jsonify({'success': False, 'msg': f'No sensor with id "{sensorID}" existing'}) + + database.measurementAccess.add_measurement(sensorID, parameters[SensorParameters.VALUE.value]) + except ValidationError as e: + return e.response, 400 + + return jsonify({'success': True}) + @measurements.route('/measurement/<int:measurementID>', methods=['DELETE']) @require_api_key(password=settings['api']['key']) def delete_measurement(measurementID): diff --git a/src/logic/Parameters.py b/src/logic/Parameters.py index b9f44789fe1da9f57af48987c876d8f597cdbbd3..a8d66ea6c344dfac48e8613f871abb9e17b9c6bb 100644 --- a/src/logic/Parameters.py +++ b/src/logic/Parameters.py @@ -19,3 +19,13 @@ class SensorParameters(Enum): @staticmethod def get_values(): return [m.value for m in SensorParameters] + + +class MeasurementParameters(Enum): + SENSOR_ID = 'sensor_id' + VALUE = 'value' + + @staticmethod + def get_values(): + return [m.value for m in MeasurementParameters] +