From 5b786e3a808f76d5892bb6fb8a8bb85fd1da5d4f Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 25 Sep 2020 14:11:18 +0200
Subject: [PATCH] #8 - post route for device

---
 docs/api.yml                   | 37 ++++++++++++++++++++++++++++++++++
 src/blueprints/Devices.py      | 23 ++++++++++++++++++++-
 src/blueprints/Measurements.py |  2 +-
 3 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/docs/api.yml b/docs/api.yml
index e835c62..dbf8491 100644
--- a/docs/api.yml
+++ b/docs/api.yml
@@ -103,6 +103,34 @@ paths:
                 type: array
                 items:
                   $ref: '#/components/schemas/Sensor'
+  /device:
+    post:
+      tags:
+        - device
+      summary: Adds a new device. If a device with the provided name already exists an error response is returned.
+      operationId: addDevice
+      security:
+        - bearerAuth: []
+      requestBody:
+        description: Device to add
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/NewDevice'
+      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'
 
   /sensors:
     get:
@@ -416,6 +444,15 @@ components:
           type: string
           example: "20.15"
 
+    NewDevice:
+      type: object
+      required:
+        - device
+      properties:
+        device:
+          type: string
+          example: "myDevice"
+
     SuccessResponse:
       required:
         - success
diff --git a/src/blueprints/Devices.py b/src/blueprints/Devices.py
index c2088ba..4b84ea2 100644
--- a/src/blueprints/Devices.py
+++ b/src/blueprints/Devices.py
@@ -1,6 +1,8 @@
-from flask import Blueprint, jsonify
+from flask import Blueprint, jsonify, request
 
 from logic.AuthenticationWrapper import require_api_key
+from logic.Parameters import DeviceParameters
+from logic.RequestValidator import RequestValidator, ValidationError
 from logic.database.Database import Database
 
 
@@ -42,4 +44,23 @@ def construct_blueprint(settings):
 
         return jsonify({'success': True})
 
+    @devices.route('/device', methods=['POST'])
+    @require_api_key(password=settings['api']['key'])
+    def add_device():
+        try:
+            parameters = RequestValidator.validate(request, [DeviceParameters.DEVICE.value])
+            database = Database(settings['database']['databasePath'])
+
+            deviceName = parameters[DeviceParameters.DEVICE.value]
+            existingDevice = database.deviceAccess.get_device_by_name(deviceName)
+            if existingDevice:
+                return jsonify({'success': False,
+                                'msg': f'A device called "{deviceName}" already exists (ID: {existingDevice["id"]})'})
+
+            database.deviceAccess.add_device(deviceName)
+        except ValidationError as e:
+            return e.response, 400
+
+        return jsonify({'success': True})
+
     return devices
diff --git a/src/blueprints/Measurements.py b/src/blueprints/Measurements.py
index 536b8ee..535c9db 100644
--- a/src/blueprints/Measurements.py
+++ b/src/blueprints/Measurements.py
@@ -23,7 +23,7 @@ def construct_blueprint(settings):
 
     @measurements.route('/measurements', methods=['POST'])
     @require_api_key(password=settings['api']['key'])
-    def addMeasurement():
+    def add_measurement():
         try:
             parameters = RequestValidator.validate(request, DeviceParameters.get_values())
             database = Database(settings['database']['databasePath'])
-- 
GitLab