n8n-nodes-base
Version:
Base nodes of n8n
177 lines • 7.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.description = void 0;
exports.execute = execute;
const utilities_1 = require("../../../../../utils/utilities");
const interfaces_1 = require("../../helpers/interfaces");
const utils_1 = require("../../helpers/utils");
const common_descriptions_1 = require("../common.descriptions");
const properties = [
{
displayName: 'Data Mode',
name: 'dataMode',
type: 'options',
options: [
{
name: 'Auto-Map Input Data to Columns',
value: interfaces_1.DATA_MODE.AUTO_MAP,
description: 'Use when node input properties names exactly match the table column names',
},
{
name: 'Map Each Column Manually',
value: interfaces_1.DATA_MODE.MANUAL,
description: 'Set the value for each destination column manually',
},
],
default: interfaces_1.AUTO_MAP,
description: 'Whether to map node input properties and the table data automatically or manually',
},
{
displayName: `
In this mode, make sure incoming data fields are named the same as the columns in your table. If needed, use an 'Edit Fields' node before this node to change the field names.
`,
name: 'notice',
type: 'notice',
default: '',
displayOptions: {
show: {
dataMode: [interfaces_1.DATA_MODE.AUTO_MAP],
},
},
},
{
displayName: 'Values to Send',
name: 'valuesToSend',
placeholder: 'Add Value',
type: 'fixedCollection',
typeOptions: {
multipleValueButtonText: 'Add Value',
multipleValues: true,
},
displayOptions: {
show: {
dataMode: [interfaces_1.DATA_MODE.MANUAL],
},
},
default: {},
options: [
{
displayName: 'Values',
name: 'values',
values: [
{
// eslint-disable-next-line n8n-nodes-base/node-param-display-name-wrong-for-dynamic-options
displayName: 'Column',
name: 'column',
type: 'options',
// eslint-disable-next-line n8n-nodes-base/node-param-description-wrong-for-dynamic-options
description: 'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/" target="_blank">expression</a>',
typeOptions: {
loadOptionsMethod: 'getColumns',
loadOptionsDependsOn: ['table.value'],
},
default: [],
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
},
],
},
],
},
common_descriptions_1.optionsCollection,
];
const displayOptions = {
show: {
resource: ['database'],
operation: ['insert'],
},
hide: {
table: [''],
},
};
exports.description = (0, utilities_1.updateDisplayOptions)(displayOptions, properties);
async function execute(inputItems, runQueries, nodeOptions) {
let returnData = [];
const items = (0, utils_1.replaceEmptyStringsByNulls)(inputItems, nodeOptions.replaceEmptyStrings);
const table = this.getNodeParameter('table', 0, '', { extractValue: true });
const dataMode = this.getNodeParameter('dataMode', 0);
const queryBatching = nodeOptions.queryBatching || interfaces_1.BATCH_MODE.SINGLE;
const queries = [];
if (queryBatching === interfaces_1.BATCH_MODE.SINGLE) {
let columns = [];
let insertItems = [];
const priority = nodeOptions.priority || '';
const ignore = nodeOptions.skipOnConflict ? 'IGNORE' : '';
if (dataMode === interfaces_1.DATA_MODE.AUTO_MAP) {
columns = [
...new Set(items.reduce((acc, item) => {
const itemColumns = Object.keys(item.json);
return acc.concat(itemColumns);
}, [])),
];
insertItems = this.helpers.copyInputItems(items, columns);
}
if (dataMode === interfaces_1.DATA_MODE.MANUAL) {
for (let i = 0; i < items.length; i++) {
const valuesToSend = this.getNodeParameter('valuesToSend', i, [])
.values;
const item = valuesToSend.reduce((acc, { column, value }) => {
acc[column] = value;
return acc;
}, {});
insertItems.push(item);
}
columns = [
...new Set(insertItems.reduce((acc, item) => {
const itemColumns = Object.keys(item);
return acc.concat(itemColumns);
}, [])),
];
}
const escapedColumns = columns.map(utils_1.escapeSqlIdentifier).join(', ');
const placeholder = `(${columns.map(() => '?').join(',')})`;
const replacements = items.map(() => placeholder).join(',');
const query = `INSERT ${priority} ${ignore} INTO ${(0, utils_1.escapeSqlIdentifier)(table)} (${escapedColumns}) VALUES ${replacements}`;
const values = insertItems.reduce((acc, item) => acc.concat(Object.values(item)), []);
queries.push({ query, values });
}
else {
for (let i = 0; i < items.length; i++) {
let columns = [];
let insertItem = {};
const options = this.getNodeParameter('options', i);
const priority = options.priority || '';
const ignore = options.skipOnConflict ? 'IGNORE' : '';
if (dataMode === interfaces_1.DATA_MODE.AUTO_MAP) {
columns = Object.keys(items[i].json);
insertItem = columns.reduce((acc, key) => {
if (columns.includes(key)) {
acc[key] = items[i].json[key];
}
return acc;
}, {});
}
if (dataMode === interfaces_1.DATA_MODE.MANUAL) {
const valuesToSend = this.getNodeParameter('valuesToSend', i, [])
.values;
insertItem = valuesToSend.reduce((acc, { column, value }) => {
acc[column] = value;
return acc;
}, {});
columns = Object.keys(insertItem);
}
const escapedColumns = columns.map(utils_1.escapeSqlIdentifier).join(', ');
const placeholder = `(${columns.map(() => '?').join(',')})`;
const query = `INSERT ${priority} ${ignore} INTO ${(0, utils_1.escapeSqlIdentifier)(table)} (${escapedColumns}) VALUES ${placeholder};`;
const values = Object.values(insertItem);
queries.push({ query, values });
}
}
returnData = await runQueries(queries);
return returnData;
}
//# sourceMappingURL=insert.operation.js.map