@isaac-platform/isaac-node-red
Version:
Set of Node-RED nodes to communicate with an ISAAC system
99 lines (98 loc) • 4 kB
JavaScript
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);
};