@isaac-platform/isaac-node-red
Version:
Set of Node-RED nodes to communicate with an ISAAC system
103 lines (102 loc) • 3.74 kB
JavaScript
const axios = require("axios"), utils = require("../../utils.js");
async function getAllEvents(server) {
if (!server.subsystemExternalId)
throw new Error("subsystemExternalId must be specified in the configuration node");
const response = await axios.get(
`${utils.getApiUrl(server)}/events?subsystemExternalId=${server.subsystemExternalId}`
);
return {
payload: response.data,
statusCode: response.status
};
}
async function getEvent(server, mergedConfig) {
if (!mergedConfig.externalRef)
throw new Error("externalRef must be specified");
const subsystem = await utils.getSubsystem(server), response = await axios.get(`${utils.getApiUrl(server)}/events/${subsystem._id}/${mergedConfig.externalRef}`);
return {
payload: response.data,
statusCode: response.status
};
}
async function upsertEvent(server, mergedConfig) {
if (!server.subsystemExternalId)
throw new Error("subsystemExternalId must be specified in the configuration node");
let existingEvent;
try {
({ payload: existingEvent } = await getEvent(server, mergedConfig));
} catch {
}
if (existingEvent) {
const payload2 = {
...existingEvent,
displayName: mergedConfig.displayName,
description: mergedConfig.description,
command: mergedConfig.command
}, response2 = await axios.put(`${utils.getApiUrl(server)}/events/${existingEvent._id}`, payload2);
return {
payload: response2.data,
statusCode: response2.status
};
}
const payload = {
externalRef: mergedConfig.externalRef,
displayName: mergedConfig.displayName,
description: mergedConfig.description,
command: mergedConfig.command,
subsystemExternalId: server.subsystemExternalId
}, response = await axios.post(`${utils.getApiUrl(server)}/events/`, payload);
return {
payload: response.data,
statusCode: response.status
};
}
async function deleteEvent(server, mergedConfig) {
if (!mergedConfig.externalRef)
throw new Error("externalRef must be specified");
const subsystem = await utils.getSubsystem(server), response = await axios.delete(`${utils.getApiUrl(server)}/events/${subsystem._id}/${mergedConfig.externalRef}`);
return {
payload: response.data,
statusCode: response.status
};
}
module.exports = (RED) => {
function EventNode(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 = getEvent(server, mergedConfig);
else if (action === "getAll")
promise = getAllEvents(server);
else if (action === "upsert")
promise = upsertEvent(server, mergedConfig);
else if (action === "delete")
promise = deleteEvent(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 event", EventNode);
};