fix(Postgres Node): Account for JSON expressions (#12012)

Co-authored-by: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com>
This commit is contained in:
Dana
2024-12-20 18:35:23 +01:00
committed by GitHub
parent d4116630a6
commit 06b86af735
4 changed files with 140 additions and 23 deletions

View File

@@ -3,7 +3,6 @@ import type {
IExecuteFunctions,
INodeExecutionData,
INodeProperties,
NodeParameterValueType,
} from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow';
@@ -15,7 +14,7 @@ import type {
QueriesRunner,
QueryWithValues,
} from '../../helpers/interfaces';
import { replaceEmptyStringsByNulls } from '../../helpers/utils';
import { isJSON, replaceEmptyStringsByNulls, stringToArray } from '../../helpers/utils';
import { optionsCollection } from '../common.descriptions';
const properties: INodeProperties[] = [
@@ -54,20 +53,19 @@ export async function execute(
nodeOptions: PostgresNodeOptions,
_db?: PgpDatabase,
): Promise<INodeExecutionData[]> {
items = replaceEmptyStringsByNulls(items, nodeOptions.replaceEmptyStrings as boolean);
const queries: QueryWithValues[] = [];
for (let i = 0; i < items.length; i++) {
let query = this.getNodeParameter('query', i) as string;
const queries: QueryWithValues[] = replaceEmptyStringsByNulls(
items,
nodeOptions.replaceEmptyStrings as boolean,
).map((_, index) => {
let query = this.getNodeParameter('query', index) as string;
for (const resolvable of getResolvables(query)) {
query = query.replace(resolvable, this.evaluateExpression(resolvable, i) as string);
query = query.replace(resolvable, this.evaluateExpression(resolvable, index) as string);
}
let values: Array<IDataObject | string> = [];
let queryReplacement = this.getNodeParameter('options.queryReplacement', i, '');
let queryReplacement = this.getNodeParameter('options.queryReplacement', index, '');
if (typeof queryReplacement === 'number') {
queryReplacement = String(queryReplacement);
@@ -78,14 +76,6 @@ export async function execute(
const rawReplacements = (node.parameters.options as IDataObject)?.queryReplacement as string;
const stringToArray = (str: NodeParameterValueType | undefined) => {
if (str === undefined) return [];
return String(str)
.split(',')
.filter((entry) => entry)
.map((entry) => entry.trim());
};
if (rawReplacements) {
const nodeVersion = nodeOptions.nodeVersion as number;
@@ -94,7 +84,12 @@ export async function execute(
const resolvables = getResolvables(rawValues);
if (resolvables.length) {
for (const resolvable of resolvables) {
const evaluatedValues = stringToArray(this.evaluateExpression(`${resolvable}`, i));
const evaluatedExpression =
this.evaluateExpression(`${resolvable}`, index)?.toString() ?? '';
const evaluatedValues = isJSON(evaluatedExpression)
? [evaluatedExpression]
: stringToArray(evaluatedExpression);
if (evaluatedValues.length) values.push(...evaluatedValues);
}
} else {
@@ -112,7 +107,7 @@ export async function execute(
if (resolvables.length) {
for (const resolvable of resolvables) {
values.push(this.evaluateExpression(`${resolvable}`, i) as IDataObject);
values.push(this.evaluateExpression(`${resolvable}`, index) as IDataObject);
}
} else {
values.push(rawValue);
@@ -127,7 +122,7 @@ export async function execute(
throw new NodeOperationError(
this.getNode(),
'Query Parameters must be a string of comma-separated values or an array of values',
{ itemIndex: i },
{ itemIndex: index },
);
}
}
@@ -142,8 +137,8 @@ export async function execute(
}
}
queries.push({ query, values, options: { partial: true } });
}
return { query, values, options: { partial: true } };
});
return await runQueries(queries, items, nodeOptions);
}