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