n8n-nodes-base
Version:
Base nodes of n8n
129 lines • 5.26 kB
JavaScript
;
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