From f7ff8a837bed336a14aa0442ed8286f3ef78f577 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 1 Nov 2015 01:06:40 +0100 Subject: core: o Adding updates of device property's name and description. web: o Ading editing of property name and description. --- src/Diller.js | 15 ++++++++++++--- src/DillerDao.js | 28 +++++++++++++++++++++------- src/web/DillerWeb.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/Diller.js b/src/Diller.js index 46dc8e2..dc4c5e7 100644 --- a/src/Diller.js +++ b/src/Diller.js @@ -21,13 +21,13 @@ function Diller(config, pg, dao) { function newName(dao, device, property, timestamp, name) { log.info('New name for property ', device.key + '/' + property.key + '.name = ' + name); - return dao.updatePropertyName(property.id, name); + return dao.updateProperty(property.id, {name: name}); } function newDescription(dao, device, property, timestamp, description) { log.info('New description for property ', device.key + '/' + property.key + '.description = ' + description); - return dao.updatePropertyDescription(property.id, description); + return dao.updateProperty(property.id, {description: description}); } function updateAggregates(propertyId, timestamp) { @@ -54,6 +54,14 @@ function Diller(config, pg, dao) { return dao.updateDevice(deviceId, attributes); } + function updatePropertyAttributes(propertyId, attributes) { + var x = _.clone(attributes); + x.propertyId = propertyId; + log.info('Updating property attributes', x); + + return dao.updateProperty(propertyId, attributes); + } + //noinspection JSUnusedLocalSymbols function onMessage(topic, message, payload) { var timestamp = new Date(); @@ -121,7 +129,8 @@ function Diller(config, pg, dao) { return { onMessage: onMessage, - updateDeviceAttributes: updateDeviceAttributes + updateDeviceAttributes: updateDeviceAttributes, + updatePropertyAttributes: updatePropertyAttributes } } diff --git a/src/DillerDao.js b/src/DillerDao.js index e7f6b54..63ad3c1 100644 --- a/src/DillerDao.js +++ b/src/DillerDao.js @@ -69,12 +69,27 @@ function DillerDao(tx) { return tx.one('INSERT INTO device_property(id, device, key, created_timestamp) VALUES(DEFAULT, $1, $2, CURRENT_TIMESTAMP) RETURNING ' + propertyColumns, [deviceId, key]); } - function updatePropertyName(id, name) { - return tx.none('UPDATE device_property SET name=$1 WHERE id=$2', [name, id]); - } + function updateProperty(id, attributes) { + var values = [id]; + var i = 2; + var fields = _(attributes).chain() + .map(function (value, attribute) { + if (attribute == 'name' || attribute == 'description') { + value = (value || '').trim(); + values.push(value.length > 0 ? value : null); + return attribute + ' = $' + i++; + } + }) + .collect() + .join(', ') + .value(); + + if (fields.length == 0) { + return Promise.resolve({}); + } - function updatePropertyDescription(id, description) { - return tx.none('UPDATE device_property SET description=$1 WHERE id=$2', description, id); + var sql = 'UPDATE device_property SET ' + fields + ' WHERE id = $1 RETURNING *'; + return tx.one(sql, values); } // ------------------------------------------------------------------------------------------------------------------- @@ -130,8 +145,7 @@ function DillerDao(tx) { devicePropertyByDeviceIdAndKey: devicePropertyByDeviceIdAndKey, devicePropertiesByDeviceId: devicePropertiesByDeviceId, insertDeviceProperty: insertDeviceProperty, - updatePropertyName: updatePropertyName, - updatePropertyDescription: updatePropertyDescription, + updateProperty: updateProperty, valuesByPropertyId: valuesByPropertyId, insertValue: insertValue, diff --git a/src/web/DillerWeb.js b/src/web/DillerWeb.js index 3f1d107..03daca7 100644 --- a/src/web/DillerWeb.js +++ b/src/web/DillerWeb.js @@ -98,6 +98,37 @@ function DillerWeb(tx, config) { }); } + function patchProperty(req, res) { + tx(function (pg, dao, diller) { + var propertyId = req.params.propertyId; + + var body = req.body; + + var p; + if (!body.attribute) { + res.status(400).json({message: 'Required keys: "attribute" and "value".'}); + } else if (body.attribute == 'name' || body.attribute == 'description') { + var attributes = {}; + attributes[body.attribute] = body.value; + + p = diller.updatePropertyAttributes(propertyId, attributes); + } else { + p = Promise.reject('Unsupported attribute: ' + body.attribute); + } + + return p.then(function (property) { + return pg.batch([ + dao.deviceById(property.device), + dao.devicePropertiesByDeviceId(property.device)] + ); + }); + }).then(function (data) { + var device = data[0]; + device.properties = data[1]; + res.json({device: device}); + }, genericErrorHandler(res)); + } + function getIndex(req, res) { var baseUrl = (req.headers['trygvis-prefix'] || '').replace(/\/$/, ''); res.render('index', {baseUrl: baseUrl + '/'}); @@ -143,7 +174,9 @@ function DillerWeb(tx, config) { addApi('getDevices', 'get', '/device', getDevices); addApi('getDevice', 'get', '/device/:deviceId', getDevice); addApi('patchDevice', 'patch', '/device/:deviceId', patchDevice); + addApi('getValues', 'get', '/property/:propertyId/values', getValues); + addApi('patchProperty', 'patch', '/property/:propertyId/values', patchProperty); var templates = express.Router(); -- cgit v1.2.3