diff --git a/src/blueprints/Routes.py b/src/blueprints/Routes.py index 81dc5d8fffaaf6c85aeed0815035845a93ed341c..5141120ae5c2558cbe750ef0e2622c824e8691fb 100644 --- a/src/blueprints/Routes.py +++ b/src/blueprints/Routes.py @@ -35,20 +35,27 @@ def construct_blueprint(settings): def postSensorData(deviceName): try: parameters = RequestValidator.validate(request, DeviceParameters.get_values()) + database = Database(settings['database']['databasePath']) + + if not database.get_device(deviceName): + database.add_device(deviceName) + device = database.get_device(deviceName) + sensors = parameters[DeviceParameters.SENSORS.value] for sensor in sensors: sensorParams = RequestValidator.validate_parameters(sensor, SensorParameters.get_values(), f'sensor "{sensor}"') - database = Database(settings['database']['databasePath']) - database.add_device_if_not_exists(deviceName) - device = database.get_device(deviceName) - database.add_or_update_sensor(device, - sensorParams['name'], - sensorParams['type'], - sensorParams['value']) - return jsonify(database.get_device("0182")) + sensorName = sensorParams[SensorParameters.NAME.value] + sensorType = sensorParams[SensorParameters.TYPE.value] + sensorValue = sensorParams[SensorParameters.VALUE.value] + + sensor = database.get_sensor(device[0], sensorName) + if sensor: + database.update_sensor(device, sensorName, sensorType, sensorValue) + else: + database.add_sensor(device, sensorName, sensorType, sensorValue) except ValidationError as e: return e.response, 400 diff --git a/src/logic/Database.py b/src/logic/Database.py index 6774059723cb2646983bd352c6efa82cc33c89d0..91ba76e1d02d0f4c60ecb366b8a406dd45ef76b3 100644 --- a/src/logic/Database.py +++ b/src/logic/Database.py @@ -42,11 +42,7 @@ class Database: cursor = connection.execute(f'SELECT * FROM {self.TABLE_DEVICE} WHERE name = "{deviceName}"') return cursor.fetchone() - def add_device_if_not_exists(self, deviceName: str): - if self.get_device(deviceName): - LOGGER.debug(f'Device "{deviceName}" already exists') - return - + def add_device(self, deviceName: str): with self.__get_connection() as connection: LOGGER.debug(f'Inserting new device "{deviceName}"') connection.execute(f'INSERT INTO {self.TABLE_DEVICE}(name) VALUES(?)', (deviceName,)) @@ -56,24 +52,22 @@ class Database: cursor = connection.execute(f'SELECT * FROM {self.TABLE_SENSOR} ORDER BY device_id, name') return cursor.fetchall() - def get_sensor(self, deviceName: str, name: str): - device = self.get_device(deviceName) - if not device: - return None - + def get_sensor(self, deviceID: int, name: str): with self.__get_connection() as connection: cursor = connection.execute(f'SELECT * FROM {self.TABLE_SENSOR} WHERE device_id = ? AND name = ?', - (device[0], name)) + (deviceID, name)) return cursor.fetchone() - def add_or_update_sensor(self, device: Tuple[int, str], name: str, sensorType: str, value: str): - sensor = self.get_sensor(device[1], name) + def add_sensor(self, device: Tuple[int, str], name: str, sensorType: str, value: str): + with self.__get_connection() as connection: + LOGGER.debug(f'Inserting new sensor "{name}" for device "{device[1]}" ' + f'(type: "{sensorType}", value: "{value}")') + connection.execute(f'INSERT INTO {self.TABLE_SENSOR}(name, device_id, type, value) VALUES(?, ?, ?, ?)', + (name, device[0], sensorType, value)) + + def update_sensor(self, device: Tuple[int, str], name: str, sensorType: str, value: str): + LOGGER.debug(f'Updating sensor "{name}" for device "{device[1]}" ' + f'(type: "{sensorType}", value: "{value}")') with self.__get_connection() as connection: - if sensor: - LOGGER.debug(f'Updating sensor "{name}" for device "{device[1]}" (type: "{sensorType}", value: "{value}")') - connection.execute(f'UPDATE {self.TABLE_SENSOR} SET value = ? WHERE device_id = ? AND name = ?', - (value, device[0], name)) - else: - LOGGER.debug(f'Inserting new sensor "{name}" for device "{device[1]}" (type: "{sensorType}", value: "{value}")') - connection.execute(f'INSERT INTO {self.TABLE_SENSOR}(name, device_id, type, value) VALUES(?, ?, ?, ?)', - (name, device[0], sensorType, value)) + connection.execute(f'UPDATE {self.TABLE_SENSOR} SET value = ? WHERE device_id = ? AND name = ?', + (value, device[0], name))