diff --git a/node-red-grist/sync-table.html b/node-red-grist/sync-table.html new file mode 100644 index 0000000..477337d --- /dev/null +++ b/node-red-grist/sync-table.html @@ -0,0 +1,68 @@ + + + + + \ No newline at end of file diff --git a/node-red-grist/sync-table.js b/node-red-grist/sync-table.js new file mode 100644 index 0000000..d378f1e --- /dev/null +++ b/node-red-grist/sync-table.js @@ -0,0 +1,25 @@ +const { GristDocAPI } = require('grist-api'); + +module.exports = function (RED) { + function SyncTableNode(config) { + RED.nodes.createNode(this, config); + let node = this; + this.document = RED.nodes.getNode(config.document); + this.server = RED.nodes.getNode(config.server); + this.table = config.tableId; + this.primaryKey = config.primaryKey; + + node.on('input', async function (msg, send, done) { + const protocol = this.server.tlsEnabled === true ? "https" : "http"; + const url = protocol + "://" + this.server.hostname + ":" + this.server.port; + const api = new GristDocAPI(this.document.docid, { apiKey: this.server.apiKey, server: url }); + const data = Array.isArray(msg.payload) ? msg.payload : [msg.payload] + + api.syncTable(this.table, data, [this.primaryKey]).then(data => { + node.send({ ...msg, payload: data }) + }).catch(reason => done(reason, "Failed to perform grist request to " + url)); + + }); + } + RED.nodes.registerType("grist-sync-table", SyncTableNode); +} \ No newline at end of file diff --git a/package.json b/package.json index b361a04..abace08 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "grist-document-export": "node-red-grist/document-export.js", "grist-add-records": "node-red-grist/add-records.js", "grist-get-records": "node-red-grist/get-records.js", + "grist-sync-table": "node-red-grist/sync-table.js", "grist-update-records": "node-red-grist/update-records.js", "grist-document": "node-red-grist/document.js", "grist-server": "node-red-grist/server.js"