UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

129 lines 5.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.description = void 0; exports.execute = execute; const utilities_1 = require("../../../../../utils/utilities"); const utils_1 = require("../../helpers/utils"); const transport_1 = require("../../transport"); const common_descriptions_1 = require("../common.descriptions"); const properties = [ { displayName: 'Columns', name: 'columns', type: 'resourceMapper', noDataExpression: true, default: { mappingMode: 'defineBelow', value: null, }, required: true, typeOptions: { loadOptionsDependsOn: ['table.value', 'base.value'], resourceMapper: { resourceMapperMethod: 'getColumnsWithRecordId', mode: 'update', fieldWords: { singular: 'column', plural: 'columns', }, addAllFields: true, multiKeyMatch: true, }, }, }, ...common_descriptions_1.insertUpdateOptions, ]; const displayOptions = { show: { resource: ['record'], operation: ['upsert'], }, }; exports.description = (0, utilities_1.updateDisplayOptions)(displayOptions, properties); async function execute(items, base, table) { const returnData = []; const endpoint = `${base}/${table}`; const dataMode = this.getNodeParameter('columns.mappingMode', 0); const columnsToMatchOn = this.getNodeParameter('columns.matchingColumns', 0); for (let i = 0; i < items.length; i++) { try { const records = []; const options = this.getNodeParameter('options', i, {}); if (dataMode === 'autoMapInputData') { if (columnsToMatchOn.includes('id')) { const { id, ...fields } = items[i].json; records.push({ id: id, fields: (0, utils_1.removeIgnored)(fields, options.ignoreFields), }); } else { records.push({ fields: (0, utils_1.removeIgnored)(items[i].json, options.ignoreFields) }); } } if (dataMode === 'defineBelow') { const fields = this.getNodeParameter('columns.value', i, []); if (columnsToMatchOn.includes('id')) { const id = fields.id; delete fields.id; records.push({ id, fields }); } else { records.push({ fields }); } } const body = { typecast: options.typecast ? true : false, }; if (!columnsToMatchOn.includes('id')) { body.performUpsert = { fieldsToMergeOn: columnsToMatchOn }; } let responseData; try { responseData = await transport_1.batchUpdate.call(this, endpoint, body, records); } catch (error) { if (error.httpCode === '422' && columnsToMatchOn.includes('id')) { const createBody = { ...body, records: records.map(({ fields }) => ({ fields })), }; responseData = await transport_1.apiRequest.call(this, 'POST', endpoint, createBody); } else if (error?.description?.includes('Cannot update more than one record')) { const conditions = columnsToMatchOn .map((column) => `{${column}} = '${records[0].fields[column]}'`) .join(','); const response = await transport_1.apiRequestAllItems.call(this, 'GET', endpoint, {}, { fields: columnsToMatchOn, filterByFormula: `AND(${conditions})`, }); const matches = response.records; const updateRecords = []; if (options.updateAllMatches) { updateRecords.push(...matches.map(({ id }) => ({ id, fields: records[0].fields }))); } else { updateRecords.push({ id: matches[0].id, fields: records[0].fields }); } responseData = await transport_1.batchUpdate.call(this, endpoint, body, updateRecords); } else { throw error; } } const executionData = this.helpers.constructExecutionMetaData((0, utilities_1.wrapData)(responseData.records), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { error = (0, utils_1.processAirtableError)(error, undefined, i); if (this.continueOnFail()) { returnData.push({ json: { message: error.message, error } }); continue; } throw error; } } return returnData; } //# sourceMappingURL=upsert.operation.js.map