@skylord123/node-red-pebble-timeline
Version:
Node-RED nodes for interacting with the Pebble Timeline API
121 lines (108 loc) • 4.83 kB
JavaScript
const store = require('./pebble-timeline-store');
module.exports = function(RED) {
function PebbleTimelineListNode(config) {
RED.nodes.createNode(this, config);
const node = this;
const configNode = RED.nodes.getNode(config.config);
if (!configNode) {
node.error("No Pebble Timeline configuration found");
return;
}
store.init(RED.settings.userDir);
node.on('input', function(msg, send, done) {
send = send || function() { node.send.apply(node, arguments) };
let startTime = null;
let endTime = null;
let apiUrlOverride = null;
let tokenOverride = null;
Promise.resolve()
.then(() => {
return new Promise((resolve) => {
if (config.apiUrl) {
RED.util.evaluateNodeProperty(config.apiUrl, config.apiUrlType, node, msg, (err, result) => {
if (!err && result) {
apiUrlOverride = result;
}
resolve();
});
} else {
resolve();
}
});
})
.then(() => {
return new Promise((resolve) => {
if (config.token) {
RED.util.evaluateNodeProperty(config.token, config.tokenType, node, msg, (err, result) => {
if (!err && result) {
tokenOverride = result;
}
resolve();
});
} else {
resolve();
}
});
})
.then(() => {
return new Promise((resolve) => {
if (config.startTime) {
RED.util.evaluateNodeProperty(config.startTime, config.startTimeType, node, msg, (err, result) => {
if (!err && result) {
startTime = new Date(result);
if (isNaN(startTime.getTime())) {
node.warn("Invalid start time format");
startTime = null;
}
}
resolve();
});
} else {
resolve();
}
});
})
.then(() => {
return new Promise((resolve) => {
if (config.endTime) {
RED.util.evaluateNodeProperty(config.endTime, config.endTimeType, node, msg, (err, result) => {
if (!err && result) {
endTime = new Date(result);
if (isNaN(endTime.getTime())) {
node.warn("Invalid end time format");
endTime = null;
}
}
resolve();
});
} else {
resolve();
}
});
})
.then(() => {
const key = store.resolveKey(configNode, tokenOverride);
const pins = store.getPins(key);
const filteredPins = pins.filter(pin => {
if (startTime !== null && new Date(pin.time) < startTime) return false;
if (endTime !== null && new Date(pin.time) > endTime) return false;
return true;
});
msg.payload = filteredPins;
msg.count = filteredPins.length;
node.status({fill: "green", shape: "dot", text: `${filteredPins.length} pins found`});
send(msg);
if (done) done();
})
.catch(error => {
node.error(`Error listing pins: ${error.message}`, msg);
if (done) done(error);
});
});
node.on('close', function() {
});
}
RED.nodes.registerType("pebble-timeline-list", PebbleTimelineListNode, {
credentials: {}
});
};