From 4b0d7cbda1ece16dfd0deba9eb66dd293b2d0413 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 14 Oct 2020 20:09:51 +0200
Subject: [PATCH] Fixed #11 - route to retrieve min/max values for given sensor
 ids

---
 docs/api.yml                   | 33 +++++++++++++++++++++++++++++++--
 src/blueprints/Measurements.py | 26 ++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/docs/api.yml b/docs/api.yml
index 8d0b35e..a54fc6c 100644
--- a/docs/api.yml
+++ b/docs/api.yml
@@ -10,6 +10,8 @@ info:
 paths:
   /version:
     get:
+      tags:
+        - general
       summary: Gets information about the server version
       operationId: version
       responses:
@@ -209,7 +211,7 @@ paths:
             type: integer
         - in: path
           name: limit
-          description: Maximum number of results.
+          description: Maximum number of results. Set to "0" to disable limit.
           required: true
           schema:
             type: integer
@@ -282,7 +284,7 @@ paths:
       parameters:
         - in: path
           name: limit
-          description: Maximum number of results.
+          description: Maximum number of results. Set to "0" to disable limit.
           required: true
           schema:
             type: integer
@@ -296,6 +298,33 @@ paths:
                 items:
                   $ref: '#/components/schemas/Measurement'
 
+  /measurements/minMax:
+    get:
+      tags:
+        - measurement
+      summary: Gets the minimum and maximum values for the given sensor ids.
+      operationId: measurementsMinMax
+      parameters:
+        - in: query
+          name: sensorIds
+          description: The sensor ids to calculate the min and max value for.
+          required: true
+          style: form
+          explode: false
+          schema:
+            type: array
+            items:
+              type: integer
+      responses:
+        '200':
+          description: All available measurements
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/Measurement'
+
   /measurements:
     post:
       tags:
diff --git a/src/blueprints/Measurements.py b/src/blueprints/Measurements.py
index 1d76e0a..3dd7ee9 100644
--- a/src/blueprints/Measurements.py
+++ b/src/blueprints/Measurements.py
@@ -17,6 +17,32 @@ def construct_blueprint(settings: Dict, backupService: BackupService):
         database = Database(settings['database']['databasePath'], backupService)
         return jsonify(database.measurementAccess.get_all_measurements(limit))
 
+    @measurements.route('/measurements/minMax', methods=['GET'])
+    def get_min_and_max_for_sensor_ids():
+        if 'sensorIds' not in request.args:
+            return jsonify({'message': 'Parameter "sensorIds" missing'}), 400
+
+        sensorIds = request.args.get('sensorIds').split(',')
+        database = Database(settings['database']['databasePath'], backupService)
+
+        values = []
+        for sensorId in sensorIds:
+            sensorId = int(sensorId)
+            latestValue = database.measurementAccess.get_latest_measurements_for_sensor(sensorId)
+            if latestValue:
+                values.append(float(latestValue['value']))
+
+        if values:
+            return jsonify({
+                'min': min(values),
+                'max': max(values)
+            })
+
+        return jsonify({
+            'min': None,
+            'max': None
+        })
+
     @measurements.route('/measurement/<int:measurementID>', methods=['GET'])
     def get_measurement(measurementID):
         database = Database(settings['database']['databasePath'], backupService)
-- 
GitLab