UNPKG

@isaac-platform/isaac-node-red

Version:

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

103 lines (102 loc) 3.74 kB
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); };