mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-27 21:49:41 -08:00
e77fd5d286
Ensure all errors in `nodes-base` are `ApplicationError` or children of it and contain no variables in the message, to continue normalizing all the backend errors we report to Sentry. Also, skip reporting to Sentry errors from user input and from external APIs. In future we should refine `ApplicationError` to more specific errors. Follow-up to: [#7877](https://github.com/n8n-io/n8n/pull/7877) - [x] Test workflows: https://github.com/n8n-io/n8n/actions/runs/7084627970 - [x] e2e: https://github.com/n8n-io/n8n/actions/runs/7084936861 --------- Co-authored-by: Michael Kret <michael.k@radency.com>
86 lines
1.9 KiB
TypeScript
86 lines
1.9 KiB
TypeScript
import { ApplicationError, type IDataObject, type NodeApiError } from 'n8n-workflow';
|
|
import type { UpdateRecord } from './interfaces';
|
|
|
|
export function removeIgnored(data: IDataObject, ignore: string | string[]) {
|
|
if (ignore) {
|
|
let ignoreFields: string[] = [];
|
|
|
|
if (typeof ignore === 'string') {
|
|
ignoreFields = ignore.split(',').map((field) => field.trim());
|
|
} else {
|
|
ignoreFields = ignore;
|
|
}
|
|
|
|
const newData: IDataObject = {};
|
|
|
|
for (const field of Object.keys(data)) {
|
|
if (!ignoreFields.includes(field)) {
|
|
newData[field] = data[field];
|
|
}
|
|
}
|
|
|
|
return newData;
|
|
} else {
|
|
return data;
|
|
}
|
|
}
|
|
|
|
export function findMatches(
|
|
data: UpdateRecord[],
|
|
keys: string[],
|
|
fields: IDataObject,
|
|
updateAll?: boolean,
|
|
) {
|
|
if (updateAll) {
|
|
const matches = data.filter((record) => {
|
|
for (const key of keys) {
|
|
if (record.fields[key] !== fields[key]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
|
|
if (!matches?.length) {
|
|
throw new ApplicationError('No records match provided keys', { level: 'warning' });
|
|
}
|
|
|
|
return matches;
|
|
} else {
|
|
const match = data.find((record) => {
|
|
for (const key of keys) {
|
|
if (record.fields[key] !== fields[key]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
|
|
if (!match) {
|
|
throw new ApplicationError('Record matching provided keys was not found', {
|
|
level: 'warning',
|
|
});
|
|
}
|
|
|
|
return [match];
|
|
}
|
|
}
|
|
|
|
export function processAirtableError(error: NodeApiError, id?: string) {
|
|
if (error.description === 'NOT_FOUND' && id) {
|
|
error.description = `${id} is not a valid Record ID`;
|
|
}
|
|
if (error.description?.includes('You must provide an array of up to 10 record objects') && id) {
|
|
error.description = `${id} is not a valid Record ID`;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
export const flattenOutput = (record: IDataObject) => {
|
|
const { fields, ...rest } = record;
|
|
return {
|
|
...rest,
|
|
...(fields as IDataObject),
|
|
};
|
|
};
|