UNPKG

@isaac-platform/isaac-node-red

Version:

Set of Node-RED nodes to communicate with an ISAAC system

99 lines (98 loc) 4 kB
const axios = require("axios"), utils = require("../../utils.js"); async function getAllControlPanels(server, mergedConfig) { let url = `${utils.getApiUrl(server)}/controlpanels?subsystemExternalId=${server.subsystemExternalId}`; (mergedConfig.location === "registered" || mergedConfig.location === "available") && (url = `${url}&location=${mergedConfig.location}`); const response = await axios.get(url); return { payload: response.data, statusCode: response.status }; } async function getControlPanel(server, mergedConfig) { if (!mergedConfig._id && mergedConfig._id !== 0) throw new Error("_id must be specified"); const response = await axios.get(`${utils.getApiUrl(server)}/controlpanels/${mergedConfig._id}`); return { payload: response.data, statusCode: response.status }; } async function addControlPanel(server, mergedConfig) { const payload = utils.getPayload(mergedConfig), location = payload.location || mergedConfig.location; if (!location) throw new Error("Panel location must be specified (registered or available)"); if (!["registered", "available"].includes(location)) throw new Error(`Invalid panel location "${location}"`); const body = { subsystemExternalId: server.subsystemExternalId, ...payload }, response = await axios.post(`${utils.getApiUrl(server)}/controlpanels?location=${location}`, body); return { payload: response.data, statusCode: response.status }; } async function updateControlPanel(server, mergedConfig) { const { payload: existingControlPanel } = await getControlPanel(server, mergedConfig); if (!existingControlPanel) throw new Error(`Control panel with ID ${mergedConfig._id} does not exist`); const { _id: _, ...updatedProperties } = utils.getPayload(mergedConfig), body = { ...existingControlPanel, ...updatedProperties }, response = await axios.put(`${utils.getApiUrl(server)}/controlpanels/${existingControlPanel._id}`, body); return { payload: response.data, status: response.status }; } async function deleteControlPanel(server, mergedConfig) { if (!mergedConfig._id && mergedConfig._id !== 0) throw new Error("_id must be specified"); const response = await axios.delete(`${utils.getApiUrl(server)}/controlpanels/${mergedConfig._id}`); return { payload: response.data, statusCode: response.status }; } module.exports = (RED) => { function ControlPanelNode(config) { RED.nodes.createNode(this, config); const node = this, server = RED.nodes.getNode(config.isaacConnection), didAddUsedConnection = utils.incrementConnectionUsage(node, server); this.on("input", async (msg) => { try { if (!server) throw new Error("No ISAAC connection configured"); const mergedConfig = utils.mergeConfig({ config, msg }), action = utils.getAction({ config, msg }); let promise; if (action === "getOne") promise = getControlPanel(server, mergedConfig); else if (action === "getAll") promise = getAllControlPanels(server, mergedConfig); else if (action === "add") promise = addControlPanel(server, mergedConfig); else if (action === "update") promise = updateControlPanel(server, mergedConfig); else if (action === "delete") promise = deleteControlPanel(server, mergedConfig); else throw new Error(`Invalid action "${action}"`); const result = await promise; node.send({ ...msg, ...result }); } catch (e) { const niceMessage = utils.getNiceAxiosErrorMessage(e); if (niceMessage) { const error = new Error(niceMessage); node.error(error, msg); return; } node.error(e, msg); } }), this.on("close", () => { didAddUsedConnection && utils.decrementConnectionUsage(node, server); }); } RED.nodes.registerType("isaac control panel", ControlPanelNode); };