From 97ac1c91a8c9a0956fa8dc7143104b540d37a27e Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Fri, 25 Sep 2020 15:02:09 +0200 Subject: [PATCH] #8 - post route for measurement --- docs/api.yml | 51 ++++++++++++++++++++++++++++++---- src/blueprints/Measurements.py | 21 ++++++++++++-- src/logic/Parameters.py | 10 +++++++ 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/docs/api.yml b/docs/api.yml index 69c2391..4faa08b 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 6ddcdf4..764da8c 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 b9f4478..a8d66ea 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] + -- GitLab