UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

806 lines 41.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Coda = void 0; const n8n_workflow_1 = require("n8n-workflow"); const ControlDescription_1 = require("./ControlDescription"); const FormulaDescription_1 = require("./FormulaDescription"); const GenericFunctions_1 = require("./GenericFunctions"); const TableDescription_1 = require("./TableDescription"); const ViewDescription_1 = require("./ViewDescription"); class Coda { description = { displayName: 'Coda', name: 'coda', icon: 'file:coda.svg', group: ['output'], version: [1, 1.1], subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Consume Coda API', defaults: { name: 'Coda', }, usableAsTool: true, inputs: [n8n_workflow_1.NodeConnectionTypes.Main], outputs: [n8n_workflow_1.NodeConnectionTypes.Main], credentials: [ { name: 'codaApi', required: true, }, ], properties: [ { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Control', value: 'control', description: 'Controls provide a user-friendly way to input a value that can affect other parts of the doc', }, { name: 'Formula', value: 'formula', description: 'Formulas can be great for performing one-off computations', }, { name: 'Table', value: 'table', description: 'Access data of tables in documents', }, { name: 'View', value: 'view', description: 'Access data of views in documents', }, ], default: 'table', }, ...TableDescription_1.tableOperations, ...TableDescription_1.tableFields, ...FormulaDescription_1.formulaOperations, ...FormulaDescription_1.formulaFields, ...ControlDescription_1.controlOperations, ...ControlDescription_1.controlFields, ...ViewDescription_1.viewOperations, ...ViewDescription_1.viewFields, ], }; methods = { loadOptions: { // Get all the available docs to display them to user so that they can // select them easily async getDocs() { const returnData = []; const qs = {}; const docs = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', '/docs', {}, qs); for (const doc of docs) { const docName = doc.name; const docId = doc.id; returnData.push({ name: docName, value: docId, }); } return returnData; }, // Get all the available tables to display them to user so that they can // select them easily async getTables() { const returnData = []; const docId = this.getCurrentNodeParameter('docId'); const tables = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', `/docs/${docId}/tables`, {}); for (const table of tables) { const tableName = table.name; const tableId = table.id; returnData.push({ name: tableName, value: tableId, }); } return returnData; }, // Get all the available columns to display them to user so that they can // select them easily async getColumns() { const returnData = []; const docId = this.getCurrentNodeParameter('docId'); const tableId = this.getCurrentNodeParameter('tableId'); const columns = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', `/docs/${docId}/tables/${tableId}/columns`, {}); for (const column of columns) { const columnName = column.name; const columnId = column.id; returnData.push({ name: columnName, value: columnId, }); } return returnData; }, // Get all the available views to display them to user so that they can // select them easily async getViews() { const returnData = []; const docId = this.getCurrentNodeParameter('docId'); const views = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', `/docs/${docId}/tables?tableTypes=view`, {}); for (const view of views) { const viewName = view.name; const viewId = view.id; returnData.push({ name: viewName, value: viewId, }); } return returnData; }, // Get all the available formulas to display them to user so that they can // select them easily async getFormulas() { const returnData = []; const docId = this.getCurrentNodeParameter('docId'); const formulas = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', `/docs/${docId}/formulas`, {}); for (const formula of formulas) { const formulaName = formula.name; const formulaId = formula.id; returnData.push({ name: formulaName, value: formulaId, }); } return returnData; }, // Get all the available view rows to display them to user so that they can // select them easily async getViewRows() { const returnData = []; const docId = this.getCurrentNodeParameter('docId'); const viewId = this.getCurrentNodeParameter('viewId'); const viewRows = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', `/docs/${docId}/tables/${viewId}/rows`, {}); for (const viewRow of viewRows) { const viewRowName = viewRow.name; const viewRowId = viewRow.id; returnData.push({ name: viewRowName, value: viewRowId, }); } return returnData; }, // Get all the available view columns to display them to user so that they can // select them easily async getViewColumns() { const returnData = []; const docId = this.getCurrentNodeParameter('docId'); const viewId = this.getCurrentNodeParameter('viewId'); const viewColumns = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', `/docs/${docId}/tables/${viewId}/columns`, {}); for (const viewColumn of viewColumns) { const viewColumnName = viewColumn.name; const viewColumnId = viewColumn.id; returnData.push({ name: viewColumnName, value: viewColumnId, }); } return returnData; }, }, }; async execute() { const nodeVersion = this.getNode().typeVersion; const returnData = []; const items = this.getInputData(); let responseData; const resource = this.getNodeParameter('resource', 0); let qs = {}; const operation = this.getNodeParameter('operation', 0); if (resource === 'table') { // https://coda.io/developers/apis/v1beta1#operation/upsertRows if (operation === 'createRow') { try { const sendData = {}; for (let i = 0; i < items.length; i++) { qs = {}; const docId = this.getNodeParameter('docId', i); const tableId = this.getNodeParameter('tableId', i); const options = this.getNodeParameter('options', i); const endpoint = `/docs/${docId}/tables/${tableId}/rows`; if (options.disableParsing) { qs.disableParsing = options.disableParsing; } const cells = []; cells.length = 0; for (const key of Object.keys(items[i].json)) { cells.push({ column: key, value: items[i].json[key], }); } // Collect all the data for the different docs/tables if (sendData[endpoint] === undefined) { sendData[endpoint] = { rows: [], // TODO: This is not perfect as it ignores if qs changes between // different items but should be OK for now qs, }; } sendData[endpoint].rows.push({ cells }); if (options.keyColumns) { // @ts-ignore sendData[endpoint].keyColumns = options.keyColumns.split(','); } } // Now that all data got collected make all the requests for (const endpoint of Object.keys(sendData)) { await GenericFunctions_1.codaApiRequest.call(this, 'POST', endpoint, sendData[endpoint], sendData[endpoint].qs); } } catch (error) { if (this.continueOnFail()) { return [this.helpers.returnJsonArray({ error: error.message })]; } throw error; } // Return the incoming data return [items]; } // https://coda.io/developers/apis/v1beta1#operation/getRow if (operation === 'getRow') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const tableId = this.getNodeParameter('tableId', i); const rowId = this.getNodeParameter('rowId', i); const options = this.getNodeParameter('options', i); const endpoint = `/docs/${docId}/tables/${tableId}/rows/${rowId}`; if (options.useColumnNames === false) { qs.useColumnNames = options.useColumnNames; } else { qs.useColumnNames = true; } if (options.valueFormat) { qs.valueFormat = options.valueFormat; } responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); if (options.rawData === true) { const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } else { const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ id: responseData.id, ...responseData.values, }), { itemData: { item: i } }); returnData.push(...executionData); } } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } // https://coda.io/developers/apis/v1beta1#operation/listRows if (operation === 'getAllRows') { let itemsLength = items.length ? 1 : 0; if (nodeVersion >= 1.1) { itemsLength = items.length; } for (let i = 0; i < itemsLength; i++) { const docId = this.getNodeParameter('docId', i); const returnAll = this.getNodeParameter('returnAll', i); const tableId = this.getNodeParameter('tableId', i); const options = this.getNodeParameter('options', i); const endpoint = `/docs/${docId}/tables/${tableId}/rows`; if (options.useColumnNames === false) { qs.useColumnNames = options.useColumnNames; } else { qs.useColumnNames = true; } if (options.valueFormat) { qs.valueFormat = options.valueFormat; } if (options.sortBy) { qs.sortBy = options.sortBy; } if (options.visibleOnly) { qs.visibleOnly = options.visibleOnly; } if (options.query) { qs.query = options.query; } try { if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}, qs); } else { qs.limit = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } if (options.rawData === true) { for (const item of responseData) { returnData.push({ json: item, pairedItem: [{ item: i }], }); } } else { for (const item of responseData) { returnData.push({ json: { id: item.id, ...item.values, }, pairedItem: [{ item: i }], }); } } } catch (error) { if (this.continueOnFail()) { returnData.push({ json: { error: error.message }, pairedItem: [{ item: i }], }); continue; } throw new n8n_workflow_1.NodeApiError(this.getNode(), error); } } return [returnData]; } // https://coda.io/developers/apis/v1beta1#operation/deleteRows if (operation === 'deleteRow') { try { const sendData = {}; for (let i = 0; i < items.length; i++) { const docId = this.getNodeParameter('docId', i); const tableId = this.getNodeParameter('tableId', i); const rowId = this.getNodeParameter('rowId', i); const endpoint = `/docs/${docId}/tables/${tableId}/rows`; // Collect all the data for the different docs/tables if (sendData[endpoint] === undefined) { sendData[endpoint] = []; } sendData[endpoint].push(rowId); } // Now that all data got collected make all the requests for (const endpoint of Object.keys(sendData)) { await GenericFunctions_1.codaApiRequest.call(this, 'DELETE', endpoint, { rowIds: sendData[endpoint] }, qs); } } catch (error) { if (this.continueOnFail()) { return [this.helpers.returnJsonArray({ error: error.message })]; } throw error; } // Return the incoming data return [items]; } // https://coda.io/developers/apis/v1beta1#operation/pushButton if (operation === 'pushButton') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const tableId = this.getNodeParameter('tableId', i); const rowId = this.getNodeParameter('rowId', i); const columnId = this.getNodeParameter('columnId', i); const endpoint = `/docs/${docId}/tables/${tableId}/rows/${rowId}/buttons/${columnId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'POST', endpoint, {}); returnData.push(responseData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [this.helpers.returnJsonArray(returnData)]; } //https://coda.io/developers/apis/v1beta1#operation/getColumn if (operation === 'getColumn') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const tableId = this.getNodeParameter('tableId', i); const columnId = this.getNodeParameter('columnId', i); const endpoint = `/docs/${docId}/tables/${tableId}/columns/${columnId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [this.helpers.returnJsonArray(returnData)]; } //https://coda.io/developers/apis/v1beta1#operation/listColumns if (operation === 'getAllColumns') { for (let i = 0; i < items.length; i++) { try { const returnAll = this.getNodeParameter('returnAll', 0); const docId = this.getNodeParameter('docId', i); const tableId = this.getNodeParameter('tableId', i); const endpoint = `/docs/${docId}/tables/${tableId}/columns`; if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}); } else { qs.limit = this.getNodeParameter('limit', 0); responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } } if (resource === 'formula') { //https://coda.io/developers/apis/v1beta1#operation/getFormula if (operation === 'get') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const formulaId = this.getNodeParameter('formulaId', i); const endpoint = `/docs/${docId}/formulas/${formulaId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } //https://coda.io/developers/apis/v1beta1#operation/listFormulas if (operation === 'getAll') { for (let i = 0; i < items.length; i++) { try { const returnAll = this.getNodeParameter('returnAll', 0); const docId = this.getNodeParameter('docId', i); const endpoint = `/docs/${docId}/formulas`; if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}); } else { qs.limit = this.getNodeParameter('limit', 0); responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } } if (resource === 'control') { //https://coda.io/developers/apis/v1beta1#operation/getControl if (operation === 'get') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const controlId = this.getNodeParameter('controlId', i); const endpoint = `/docs/${docId}/controls/${controlId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } //https://coda.io/developers/apis/v1beta1#operation/listControls if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', 0); qs.limit = this.getNodeParameter('limit', 0); for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const endpoint = `/docs/${docId}/controls`; if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}); } else { responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } } if (resource === 'view') { //https://coda.io/developers/apis/v1beta1#operation/getView if (operation === 'get') { for (let i = 0; i < items.length; i++) { const docId = this.getNodeParameter('docId', i); const viewId = this.getNodeParameter('viewId', i); const endpoint = `/docs/${docId}/tables/${viewId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } return [returnData]; } //https://coda.io/developers/apis/v1beta1#operation/listViews if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', 0); qs.limit = this.getNodeParameter('limit', 0); for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const endpoint = `/docs/${docId}/tables?tableTypes=view`; if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}); } else { responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } responseData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...responseData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } if (operation === 'getAllViewRows') { let itemsLength = items.length ? 1 : 0; if (nodeVersion >= 1.1) { itemsLength = items.length; } for (let i = 0; i < itemsLength; i++) { const docId = this.getNodeParameter('docId', i); const returnAll = this.getNodeParameter('returnAll', i); const viewId = this.getNodeParameter('viewId', i); const options = this.getNodeParameter('options', i); const endpoint = `/docs/${docId}/tables/${viewId}/rows`; if (options.useColumnNames === false) { qs.useColumnNames = options.useColumnNames; } else { qs.useColumnNames = true; } if (options.valueFormat) { qs.valueFormat = options.valueFormat; } if (options.sortBy) { qs.sortBy = options.sortBy; } if (options.query) { qs.query = options.query; } try { if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}, qs); } else { qs.limit = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } if (options.rawData === true) { for (const item of responseData) { returnData.push({ json: item, pairedItem: [{ item: i }], }); } } else { for (const item of responseData) { returnData.push({ json: { id: item.id, ...item.values, }, pairedItem: [{ item: i }], }); } } } catch (error) { if (this.continueOnFail()) { returnData.push({ json: { error: error.message }, pairedItem: [{ item: i }], }); continue; } throw new n8n_workflow_1.NodeApiError(this.getNode(), error); } } return [returnData]; } //https://coda.io/developers/apis/v1beta1#operation/deleteViewRow if (operation === 'deleteViewRow') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const viewId = this.getNodeParameter('viewId', i); const rowId = this.getNodeParameter('rowId', i); const endpoint = `/docs/${docId}/tables/${viewId}/rows/${rowId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'DELETE', endpoint); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } //https://coda.io/developers/apis/v1beta1#operation/pushViewButton if (operation === 'pushViewButton') { for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const viewId = this.getNodeParameter('viewId', i); const rowId = this.getNodeParameter('rowId', i); const columnId = this.getNodeParameter('columnId', i); const endpoint = `/docs/${docId}/tables/${viewId}/rows/${rowId}/buttons/${columnId}`; responseData = await GenericFunctions_1.codaApiRequest.call(this, 'POST', endpoint); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } if (operation === 'getAllViewColumns') { const returnAll = this.getNodeParameter('returnAll', 0); qs.limit = this.getNodeParameter('limit', 0); for (let i = 0; i < items.length; i++) { try { const docId = this.getNodeParameter('docId', i); const viewId = this.getNodeParameter('viewId', i); const endpoint = `/docs/${docId}/tables/${viewId}/columns`; if (returnAll) { responseData = await GenericFunctions_1.codaApiRequestAllItems.call(this, 'items', 'GET', endpoint, {}); } else { responseData = await GenericFunctions_1.codaApiRequest.call(this, 'GET', endpoint, {}, qs); responseData = responseData.items; } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.messsage }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } //https://coda.io/developers/apis/v1beta1#operation/updateViewRow if (operation === 'updateViewRow') { for (let i = 0; i < items.length; i++) { try { qs = {}; const docId = this.getNodeParameter('docId', i); const viewId = this.getNodeParameter('viewId', i); const rowId = this.getNodeParameter('rowId', i); const keyName = this.getNodeParameter('keyName', i); const options = this.getNodeParameter('options', i); const body = {}; const endpoint = `/docs/${docId}/tables/${viewId}/rows/${rowId}`; if (options.disableParsing) { qs.disableParsing = options.disableParsing; } const cells = []; cells.length = 0; //@ts-ignore for (const key of Object.keys(items[i].json[keyName])) { cells.push({ column: key, //@ts-ignore value: items[i].json[keyName][key], }); } body.row = { cells, }; await GenericFunctions_1.codaApiRequest.call(this, 'PUT', endpoint, body, qs); } catch (error) { if (this.continueOnFail()) { items[i].json = { error: error.message }; continue; } throw error; } } return [items]; } } return []; } } exports.Coda = Coda; //# sourceMappingURL=Coda.node.js.map