From f38f0fc45390b2ff0a4a31db3bd4e0072edaf599 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 25 Sep 2020 09:07:37 +0200
Subject: [PATCH] Fixed #7 - route to retrieve latest value for a sensor

---
 docs/api.yml             | 20 ++++++++++++++++++++
 src/blueprints/Routes.py |  9 +++++++++
 src/logic/Database.py    |  6 ++++++
 3 files changed, 35 insertions(+)

diff --git a/docs/api.yml b/docs/api.yml
index 15517cf..098be6d 100644
--- a/docs/api.yml
+++ b/docs/api.yml
@@ -122,6 +122,26 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/Measurement'
+  /sensor/{sensorID}/measurements/latest:
+    get:
+      summary: Gets the latest measurement for a specific sensor
+      operationId: sensorMeasurementsLatest
+      parameters:
+        - in: path
+          name: sensorID
+          description: The sensor id
+          required: true
+          schema:
+            type: integer
+      responses:
+        '200':
+          description: The latest measurement
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/Measurement'
 
   /measurements:
     get:
diff --git a/src/blueprints/Routes.py b/src/blueprints/Routes.py
index 524e729..e6a5906 100644
--- a/src/blueprints/Routes.py
+++ b/src/blueprints/Routes.py
@@ -96,6 +96,15 @@ def construct_blueprint(settings, version):
 
         return jsonify(database.get_all_measurements_for_sensor(sensorID))
 
+    @routes.route('/sensor/<sensorID>/measurements/latest', methods=['GET'])
+    def get_latest_measurements_for_sensor(sensorID):
+        database = Database(settings['database']['databasePath'])
+        sensor = database.get_sensor(sensorID)
+        if not sensor:
+            return jsonify({'success': False, 'msg': f'No sensor with id "{sensorID}" existing'})
+
+        return jsonify(database.get_latest_measurements_for_sensor(sensorID))
+
     @routes.route('/measurements', methods=['POST'])
     @require_api_key(password=settings['api']['key'])
     def addMeasurement():
diff --git a/src/logic/Database.py b/src/logic/Database.py
index be95726..e54445c 100644
--- a/src/logic/Database.py
+++ b/src/logic/Database.py
@@ -125,6 +125,12 @@ class Database:
                             sensorID,
                             fetch_type=FetchType.ALL)
 
+    def get_latest_measurements_for_sensor(self, sensorID: int) -> Dict[str, str] or None:
+        return self.__query(f'SELECT * FROM {self.TABLE_MEASUREMENT} WHERE sensor_id = ? '
+                            f'ORDER BY datetime(timestamp) DESC LIMIT 1',
+                            sensorID,
+                            fetch_type=FetchType.ONE)
+
     def add_measurement(self, sensorID: int, value: str):
         sensor = self.get_sensor(sensorID)
         LOGGER.debug(f'Inserting new measurement for sensor "{sensor["name"]}" '
-- 
GitLab