UNPKG

lisa-box

Version:
249 lines 9.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const common_1 = require("@fabrix/fabrix/dist/common"); const _ = require('lodash'); class PluginService extends common_1.FabrixService { _translatePlugin(lang, plugins) { const results = []; for (let plugin of plugins) { plugin = plugin.toJSON(); const infos = plugin.infos; const image = this._translateField(lang, infos.image); const pluginData = { id: plugin.name, name: this._translateField(lang, infos.name), description: this._translateField(lang, infos.description), image: image ? '/plugin/' + plugin.name + '/images/' + image : null, settings: this._translateSettings(lang, plugin.settings), devicesSettings: this._translateDevices(lang, plugin, plugin.devicesSettings) }; results.push(pluginData); } return results; } _translateDevices(lang, plugin, devices) { const translatedDevices = []; for (const device of devices) { const image = this._translateField(lang, device.image); const settings = this._translateSettings(lang, device.settings); translatedDevices.push({ name: this._translateField(lang, device.name), description: this._translateField(lang, device.description), template: device.template, driver: device.driver, pluginName: plugin.name, type: device.type, image: image ? '/plugin/' + plugin.name + '/images/' + image : null, settings: settings, pairing: device.pairing }); } return translatedDevices; } _translateSettings(lang, settings) { const translatedSettings = ['labelText', 'text', 'hintText', 'errorText', 'counterText', 'helperText', 'prefixText', 'suffixText']; if (settings) { for (const setting in settings) { if (typeof settings[setting] === 'object') { settings[setting] = this._translateSettings(lang, settings[setting]); } else { if (translatedSettings.includes(setting)) { settings[setting] = this._translateField(lang, settings[setting]); } } } } return settings; } _translateField(lang, field) { let result; if (field) { if (_.isString(field)) { result = field; } else if (field[lang]) { result = field[lang]; } else { result = field['en']; } } return result; } find(lang, criteria, options) { const footprintService = this.app.services.FootprintService; return footprintService.find('plugin', criteria, options) .then(plugins => this._translatePlugin(lang, plugins)); } pairing(plugin, driver, data) { return this.app.services.PluginService.callOnPluginDriver('pairing', plugin, driver, [data]).then(results => { return Promise.resolve(results); }).catch(err => { if (err.step) { return Promise.resolve(err); } return Promise.reject(err); }); } getDevicesForPairing(plugin, driver) { return this.app.services.PluginService.callOnPluginDriver('getDevices', plugin, driver, []).then(results => { return Promise.resolve(results); }).catch(err => { return Promise.reject(err); }); } setGroupValue(roomId, groupId, data) { const type = 'light'; return this.app.orm.Device.findAll({ where: { roomId: roomId } }).then(devices => { const filteredDevices = devices.filter(device => device.type === type); const pluginFilteredDevices = {}; filteredDevices.forEach(device => { const pluginName = device.pluginName; if (pluginFilteredDevices[pluginName]) { pluginFilteredDevices[pluginName].push(device); } else { pluginFilteredDevices[pluginName] = [device]; } }); const key = data.key; const value = data.value || false; const promises = []; _.forEach(pluginFilteredDevices, (devices, pluginName) => { promises.push(this.setDevicesValue(pluginName, [devices.map(device => device.toRawData()), key, value])); }); return Promise.all(promises); }); } setValue(deviceId, data) { if (process.env.DEMO_MODE) { return this.app.orm.Device.findById(deviceId).then(device => { if (device) { const key = data.key; let value = data.value || false; if (!isNaN(value)) { value = +value; } if (value === 'true') { value = true; } if (value === 'false') { value = false; } device = device.toRawData(); device.data[key] = value; return this.app.orm.Device.update(device, { where: { id: device.id } }).then(result => device); } else { return Promise.reject(new Error('Not found')); } }); } else { return this.app.orm.Device.findById(deviceId).then(device => { if (device) { const key = data.key; let value = data.value || false; const plugin = data.plugin; if (!isNaN(value)) { value = +value; } if (value === 'true') { value = true; } if (value === 'false') { value = false; } return this.setDeviceValue(plugin, [device.toRawData(), key, value]) .then(_ => { return Promise.resolve(device); }); } else { return Promise.reject(new Error('Not found')); } }); } } interact(infos) { if (infos.action === 'UNKNOWN') { return Promise.resolve(infos); } else { const roomPromise = []; const keys = Object.keys(_.omit(infos.fields, ['room'])); if (infos.fields.room) { roomPromise.push(this.app.orm.Room.find({ where: { name: { $like: infos.fields.room } } })); } else { roomPromise.push(Promise.resolve()); } if (infos.fields.device) { roomPromise.push(this.app.orm.Device.find({ where: { name: { $like: infos.fields.device } } })); } else { roomPromise.push(Promise.resolve()); } keys.forEach(key => { const param = this.app.config.chatbot.params[key]; if (param) { if (_.isPlainObject(param)) { roomPromise.push(new Promise((resolve, reject) => { infos.fields[key] = param[infos.fields[key]]; resolve(); })); } else if (_.isFunction(param)) { roomPromise.push(param(this.app).then(result => { if (_.isPlainObject(param)) { infos.fields[key] = { name: infos.fields[key], value: result[infos.fields[key]] }; } })); } } }); return Promise.all(roomPromise).then(results => { const room = results[0]; if (room) { infos.fields.room = room.toJSON(); } else { infos.fields.room = null; } const device = results[1]; if (device) { infos.fields.device = device.toRawData(); } else { infos.fields.device = null; } return this.callOnPlugins('interact', [infos.action, infos]) .then(results => { return Promise.resolve(results.action ? results : infos); }); }); } } } exports.PluginService = PluginService; //# sourceMappingURL=PluginService.js.map