n8n 1.110.1 → 1.112.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/auth.service.js +2 -0
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.js +17 -0
- package/dist/commands/start.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -1
- package/dist/constants.js.map +1 -1
- package/dist/controllers/dynamic-node-parameters.controller.js +6 -16
- package/dist/controllers/dynamic-node-parameters.controller.js.map +1 -1
- package/dist/controllers/e2e.controller.js +1 -0
- package/dist/controllers/e2e.controller.js.map +1 -1
- package/dist/controllers/folder.controller.d.ts +7 -2
- package/dist/controllers/folder.controller.js +24 -3
- package/dist/controllers/folder.controller.js.map +1 -1
- package/dist/controllers/role.controller.d.ts +5 -4
- package/dist/controllers/role.controller.js +21 -15
- package/dist/controllers/role.controller.js.map +1 -1
- package/dist/environments.ee/source-control/source-control.service.ee.js +2 -5
- package/dist/environments.ee/source-control/source-control.service.ee.js.map +1 -1
- package/dist/events/maps/relay.event-map.d.ts +4 -0
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js +8 -1
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
- package/dist/executions/execution-recovery.service.js +2 -1
- package/dist/executions/execution-recovery.service.js.map +1 -1
- package/dist/executions/execution.service.d.ts +2 -2
- package/dist/executions/execution.service.js +14 -1
- package/dist/executions/execution.service.js.map +1 -1
- package/dist/executions/execution.types.d.ts +2 -5
- package/dist/executions/executions.controller.d.ts +2 -2
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -0
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +6 -0
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
- package/dist/modules/community-packages/npm-utils.js +10 -0
- package/dist/modules/community-packages/npm-utils.js.map +1 -1
- package/dist/modules/data-table/data-store-aggregate.controller.d.ts +7 -1
- package/dist/modules/data-table/data-store-aggregate.controller.js +15 -2
- package/dist/modules/data-table/data-store-aggregate.controller.js.map +1 -1
- package/dist/modules/data-table/data-store-column.repository.js +1 -1
- package/dist/modules/data-table/data-store-column.repository.js.map +1 -1
- package/dist/modules/data-table/data-store-proxy.service.d.ts +3 -3
- package/dist/modules/data-table/data-store-proxy.service.js +13 -13
- package/dist/modules/data-table/data-store-proxy.service.js.map +1 -1
- package/dist/modules/data-table/data-store-rows.repository.d.ts +13 -20
- package/dist/modules/data-table/data-store-rows.repository.js +144 -125
- package/dist/modules/data-table/data-store-rows.repository.js.map +1 -1
- package/dist/modules/data-table/data-store-size-validator.service.d.ts +16 -0
- package/dist/modules/data-table/data-store-size-validator.service.js +79 -0
- package/dist/modules/data-table/data-store-size-validator.service.js.map +1 -0
- package/dist/modules/data-table/data-store.controller.d.ts +9 -9
- package/dist/modules/data-table/data-store.controller.js +16 -14
- package/dist/modules/data-table/data-store.controller.js.map +1 -1
- package/dist/modules/data-table/data-store.repository.d.ts +4 -1
- package/dist/modules/data-table/data-store.repository.js +47 -5
- package/dist/modules/data-table/data-store.repository.js.map +1 -1
- package/dist/modules/data-table/data-store.service.d.ts +19 -11
- package/dist/modules/data-table/data-store.service.js +102 -73
- package/dist/modules/data-table/data-store.service.js.map +1 -1
- package/dist/modules/data-table/data-store.types.d.ts +2 -0
- package/dist/modules/data-table/data-store.types.js +7 -0
- package/dist/modules/data-table/data-store.types.js.map +1 -1
- package/dist/modules/data-table/data-table.module.js +1 -1
- package/dist/modules/data-table/utils/sql-utils.d.ts +2 -5
- package/dist/modules/data-table/utils/sql-utils.js +7 -17
- package/dist/modules/data-table/utils/sql-utils.js.map +1 -1
- package/dist/public-api/types.d.ts +5 -0
- package/dist/public-api/v1/handlers/executions/executions.handler.d.ts +1 -0
- package/dist/public-api/v1/handlers/executions/executions.handler.js +34 -1
- package/dist/public-api/v1/handlers/executions/executions.handler.js.map +1 -1
- package/dist/public-api/v1/openapi.yml +60 -7
- package/dist/push/abstract.push.d.ts +2 -2
- package/dist/push/abstract.push.js +4 -4
- package/dist/push/abstract.push.js.map +1 -1
- package/dist/push/index.d.ts +3 -2
- package/dist/push/index.js +30 -26
- package/dist/push/index.js.map +1 -1
- package/dist/push/origin-validator.d.ts +13 -0
- package/dist/push/origin-validator.js +145 -0
- package/dist/push/origin-validator.js.map +1 -0
- package/dist/push/websocket.push.d.ts +1 -1
- package/dist/push/websocket.push.js +2 -2
- package/dist/push/websocket.push.js.map +1 -1
- package/dist/scaling/constants.d.ts +2 -2
- package/dist/scaling/pubsub/pubsub.event-map.d.ts +2 -0
- package/dist/scaling/pubsub/pubsub.registry.d.ts +1 -0
- package/dist/scaling/pubsub/pubsub.registry.js +9 -2
- package/dist/scaling/pubsub/pubsub.registry.js.map +1 -1
- package/dist/scaling/pubsub/pubsub.types.d.ts +2 -1
- package/dist/scaling/scaling.service.d.ts +1 -1
- package/dist/scaling/scaling.service.js +0 -4
- package/dist/scaling/scaling.service.js.map +1 -1
- package/dist/server.js +22 -23
- package/dist/server.js.map +1 -1
- package/dist/services/dynamic-node-parameters.service.d.ts +7 -1
- package/dist/services/dynamic-node-parameters.service.js +15 -2
- package/dist/services/dynamic-node-parameters.service.js.map +1 -1
- package/dist/services/frontend.service.js +5 -0
- package/dist/services/frontend.service.js.map +1 -1
- package/dist/services/ownership.service.d.ts +1 -0
- package/dist/services/ownership.service.js +6 -0
- package/dist/services/ownership.service.js.map +1 -1
- package/dist/services/public-api-key.service.js +2 -0
- package/dist/services/public-api-key.service.js.map +1 -1
- package/dist/services/role.service.d.ts +2 -2
- package/dist/services/role.service.js +3 -3
- package/dist/services/role.service.js.map +1 -1
- package/dist/sso.ee/oidc/oidc.service.ee.d.ts +25 -4
- package/dist/sso.ee/oidc/oidc.service.ee.js +167 -22
- package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.d.ts +6 -2
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.js +41 -7
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.js.map +1 -1
- package/dist/sso.ee/sso-helpers.d.ts +1 -0
- package/dist/sso.ee/sso-helpers.js +19 -0
- package/dist/sso.ee/sso-helpers.js.map +1 -1
- package/dist/task-runners/errors/missing-requirements.error.d.ts +6 -0
- package/dist/task-runners/errors/missing-requirements.error.js +17 -0
- package/dist/task-runners/errors/missing-requirements.error.js.map +1 -0
- package/dist/task-runners/internal-task-runner-disconnect-analyzer.d.ts +2 -2
- package/dist/task-runners/internal-task-runner-disconnect-analyzer.js +2 -2
- package/dist/task-runners/internal-task-runner-disconnect-analyzer.js.map +1 -1
- package/dist/task-runners/task-runner-module.d.ts +5 -3
- package/dist/task-runners/task-runner-module.js +25 -13
- package/dist/task-runners/task-runner-module.js.map +1 -1
- package/dist/task-runners/task-runner-process-base.d.ts +39 -0
- package/dist/task-runners/task-runner-process-base.js +111 -0
- package/dist/task-runners/task-runner-process-base.js.map +1 -0
- package/dist/task-runners/task-runner-process-js.d.ts +21 -0
- package/dist/task-runners/{task-runner-process.js → task-runner-process-js.js} +35 -108
- package/dist/task-runners/task-runner-process-js.js.map +1 -0
- package/dist/task-runners/task-runner-process-py.d.ts +15 -0
- package/dist/task-runners/task-runner-process-py.js +76 -0
- package/dist/task-runners/task-runner-process-py.js.map +1 -0
- package/dist/task-runners/task-runner-process-restart-loop-detector.d.ts +2 -2
- package/dist/task-runners/task-runner-process-restart-loop-detector.js.map +1 -1
- package/dist/user-management/email/templates/credentials-shared.handlebars +48 -40
- package/dist/user-management/email/templates/n8n-logo.png +0 -0
- package/dist/user-management/email/templates/password-reset-requested.handlebars +68 -60
- package/dist/user-management/email/templates/project-shared.handlebars +43 -35
- package/dist/user-management/email/templates/user-invited.handlebars +48 -40
- package/dist/user-management/email/templates/workflow-shared.handlebars +48 -40
- package/dist/workflows/workflow.request.d.ts +1 -0
- package/dist/workflows/workflow.service.ee.js +1 -0
- package/dist/workflows/workflow.service.ee.js.map +1 -1
- package/package.json +24 -18
- package/dist/task-runners/task-runner-process.d.ts +0 -36
- package/dist/task-runners/task-runner-process.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Logger } from '@n8n/backend-common';
|
|
2
2
|
import { DataStoreProxyProvider, IDataStoreProjectAggregateService, IDataStoreProjectService, INode, Workflow } from 'n8n-workflow';
|
|
3
|
-
import { DataStoreService } from './data-store.service';
|
|
4
3
|
import { OwnershipService } from '../../services/ownership.service';
|
|
4
|
+
import { DataStoreService } from './data-store.service';
|
|
5
5
|
export declare class DataStoreProxyService implements DataStoreProxyProvider {
|
|
6
6
|
private readonly dataStoreService;
|
|
7
7
|
private readonly ownershipService;
|
|
@@ -9,8 +9,8 @@ export declare class DataStoreProxyService implements DataStoreProxyProvider {
|
|
|
9
9
|
constructor(dataStoreService: DataStoreService, ownershipService: OwnershipService, logger: Logger);
|
|
10
10
|
private validateRequest;
|
|
11
11
|
private getProjectId;
|
|
12
|
-
getDataStoreAggregateProxy(workflow: Workflow, node: INode,
|
|
13
|
-
getDataStoreProxy(workflow: Workflow, node: INode, dataStoreId: string,
|
|
12
|
+
getDataStoreAggregateProxy(workflow: Workflow, node: INode, projectId?: string): Promise<IDataStoreProjectAggregateService>;
|
|
13
|
+
getDataStoreProxy(workflow: Workflow, node: INode, dataStoreId: string, projectId?: string): Promise<IDataStoreProjectService>;
|
|
14
14
|
private makeAggregateOperations;
|
|
15
15
|
private makeDataStoreOperations;
|
|
16
16
|
}
|
|
@@ -12,8 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.DataStoreProxyService = void 0;
|
|
13
13
|
const backend_common_1 = require("@n8n/backend-common");
|
|
14
14
|
const di_1 = require("@n8n/di");
|
|
15
|
-
const data_store_service_1 = require("./data-store.service");
|
|
16
15
|
const ownership_service_1 = require("../../services/ownership.service");
|
|
16
|
+
const data_store_service_1 = require("./data-store.service");
|
|
17
17
|
let DataStoreProxyService = class DataStoreProxyService {
|
|
18
18
|
constructor(dataStoreService, ownershipService, logger) {
|
|
19
19
|
this.dataStoreService = dataStoreService;
|
|
@@ -23,21 +23,21 @@ let DataStoreProxyService = class DataStoreProxyService {
|
|
|
23
23
|
}
|
|
24
24
|
validateRequest(node) {
|
|
25
25
|
if (node.type !== 'n8n-nodes-base.dataTable' && node.type !== 'n8n-nodes-base.dataTableTool') {
|
|
26
|
-
throw new Error('This proxy is only available for
|
|
26
|
+
throw new Error('This proxy is only available for Data table nodes');
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
async getProjectId(workflow) {
|
|
30
30
|
const homeProject = await this.ownershipService.getWorkflowProjectCached(workflow.id);
|
|
31
31
|
return homeProject.id;
|
|
32
32
|
}
|
|
33
|
-
async getDataStoreAggregateProxy(workflow, node,
|
|
33
|
+
async getDataStoreAggregateProxy(workflow, node, projectId) {
|
|
34
34
|
this.validateRequest(node);
|
|
35
|
-
|
|
35
|
+
projectId = projectId ?? (await this.getProjectId(workflow));
|
|
36
36
|
return this.makeAggregateOperations(projectId);
|
|
37
37
|
}
|
|
38
|
-
async getDataStoreProxy(workflow, node, dataStoreId,
|
|
38
|
+
async getDataStoreProxy(workflow, node, dataStoreId, projectId) {
|
|
39
39
|
this.validateRequest(node);
|
|
40
|
-
|
|
40
|
+
projectId = projectId ?? (await this.getProjectId(workflow));
|
|
41
41
|
return this.makeDataStoreOperations(projectId, dataStoreId);
|
|
42
42
|
}
|
|
43
43
|
makeAggregateOperations(projectId) {
|
|
@@ -85,17 +85,17 @@ let DataStoreProxyService = class DataStoreProxyService {
|
|
|
85
85
|
async getManyRowsAndCount(options) {
|
|
86
86
|
return await dataStoreService.getManyRowsAndCount(dataStoreId, projectId, options);
|
|
87
87
|
},
|
|
88
|
-
async insertRows(rows) {
|
|
89
|
-
return await dataStoreService.insertRows(dataStoreId, projectId, rows,
|
|
88
|
+
async insertRows(rows, returnType) {
|
|
89
|
+
return await dataStoreService.insertRows(dataStoreId, projectId, rows, returnType);
|
|
90
90
|
},
|
|
91
|
-
async
|
|
91
|
+
async updateRow(options) {
|
|
92
92
|
return await dataStoreService.updateRow(dataStoreId, projectId, options, true);
|
|
93
93
|
},
|
|
94
|
-
async
|
|
95
|
-
return await dataStoreService.
|
|
94
|
+
async upsertRow(options) {
|
|
95
|
+
return await dataStoreService.upsertRow(dataStoreId, projectId, options, true);
|
|
96
96
|
},
|
|
97
|
-
async deleteRows(
|
|
98
|
-
return await dataStoreService.deleteRows(dataStoreId, projectId,
|
|
97
|
+
async deleteRows(options) {
|
|
98
|
+
return await dataStoreService.deleteRows(dataStoreId, projectId, options, true);
|
|
99
99
|
},
|
|
100
100
|
};
|
|
101
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-store-proxy.service.js","sourceRoot":"","sources":["../../../src/modules/data-table/data-store-proxy.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,wDAA6C;AAC7C,gCAAkC;
|
|
1
|
+
{"version":3,"file":"data-store-proxy.service.js","sourceRoot":"","sources":["../../../src/modules/data-table/data-store-proxy.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +1,35 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { DataStoreColumnJsType, DataStoreRows, DataStoreRowReturn, DataStoreRowsReturn } from 'n8n-workflow';
|
|
1
|
+
import { ListDataStoreContentQueryDto, DataTableFilter } from '@n8n/api-types';
|
|
2
|
+
import { DataSource, DataSourceOptions, QueryRunner, EntityManager } from '@n8n/typeorm';
|
|
3
|
+
import { DataStoreColumnJsType, DataStoreRows, DataStoreRowReturn, DataStoreRowsReturn, DataTableInsertRowsReturnType, DataTableInsertRowsResult } from 'n8n-workflow';
|
|
5
4
|
import { DataStoreUserTableName } from './data-store.types';
|
|
6
5
|
import { DataTableColumn } from './data-table-column.entity';
|
|
7
6
|
export declare class DataStoreRowsRepository {
|
|
8
7
|
private dataSource;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
updatedAt: Date;
|
|
18
|
-
}[]>;
|
|
19
|
-
upsertRows<T extends boolean | undefined>(dataStoreId: string, matchFields: string[], rows: DataStoreRows, columns: DataTableColumn[], returnData?: T): Promise<T extends true ? DataStoreRowReturn[] : true>;
|
|
20
|
-
deleteRows(dataStoreId: string, ids: number[]): Promise<boolean>;
|
|
8
|
+
constructor(dataSource: DataSource);
|
|
9
|
+
insertRowsBulk(table: DataStoreUserTableName, rows: DataStoreRows, columns: DataTableColumn[], em: EntityManager): Promise<{
|
|
10
|
+
readonly success: true;
|
|
11
|
+
readonly insertedRows: number;
|
|
12
|
+
}>;
|
|
13
|
+
insertRows<T extends DataTableInsertRowsReturnType>(dataStoreId: string, rows: DataStoreRows, columns: DataTableColumn[], returnType: T, em?: EntityManager): Promise<DataTableInsertRowsResult<T>>;
|
|
14
|
+
updateRow<T extends boolean | undefined>(dataStoreId: string, data: Record<string, DataStoreColumnJsType | null>, filter: DataTableFilter, columns: DataTableColumn[], returnData?: T, em?: EntityManager): Promise<T extends true ? DataStoreRowReturn[] : true>;
|
|
15
|
+
deleteRows(dataTableId: string, columns: DataTableColumn[], filter: DataTableFilter | undefined, returnData?: boolean): Promise<true | DataStoreRowReturn[]>;
|
|
21
16
|
createTableWithColumns(dataStoreId: string, columns: DataTableColumn[], queryRunner: QueryRunner): Promise<void>;
|
|
22
17
|
dropTable(dataStoreId: string, queryRunner: QueryRunner): Promise<void>;
|
|
23
18
|
addColumn(dataStoreId: string, column: DataTableColumn, queryRunner: QueryRunner, dbType: DataSourceOptions['type']): Promise<void>;
|
|
24
19
|
dropColumnFromTable(dataStoreId: string, columnName: string, queryRunner: QueryRunner, dbType: DataSourceOptions['type']): Promise<void>;
|
|
25
|
-
getManyAndCount(dataStoreId: string, dto: ListDataStoreContentQueryDto, columns?: DataTableColumn[]): Promise<{
|
|
20
|
+
getManyAndCount(dataStoreId: string, dto: ListDataStoreContentQueryDto, columns?: DataTableColumn[], em?: EntityManager): Promise<{
|
|
26
21
|
count: number;
|
|
27
22
|
data: DataStoreRowsReturn;
|
|
28
23
|
}>;
|
|
29
|
-
getManyByIds(dataStoreId: string, ids: number[], columns: DataTableColumn[]): Promise<{
|
|
24
|
+
getManyByIds(dataStoreId: string, ids: number[], columns: DataTableColumn[], em: EntityManager): Promise<{
|
|
30
25
|
[x: string]: DataStoreColumnJsType;
|
|
31
26
|
id: number;
|
|
32
27
|
createdAt: Date;
|
|
33
28
|
updatedAt: Date;
|
|
34
29
|
}[]>;
|
|
35
|
-
getRowIds(dataStoreId: string, dto: ListDataStoreContentQueryDto): Promise<number[]>;
|
|
36
30
|
private getManyQuery;
|
|
37
31
|
private applyFilters;
|
|
38
32
|
private applySorting;
|
|
39
33
|
private applySortingByField;
|
|
40
34
|
private applyPagination;
|
|
41
|
-
private fetchAndSplitRowsByExistence;
|
|
42
35
|
}
|
|
@@ -10,21 +10,22 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.DataStoreRowsRepository = void 0;
|
|
13
|
-
const config_1 = require("@n8n/config");
|
|
14
13
|
const db_1 = require("@n8n/db");
|
|
15
14
|
const di_1 = require("@n8n/di");
|
|
16
15
|
const typeorm_1 = require("@n8n/typeorm");
|
|
17
16
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
18
17
|
const sql_utils_1 = require("./utils/sql-utils");
|
|
19
|
-
function getConditionAndParams(filter, index, dbType, columns) {
|
|
18
|
+
function getConditionAndParams(filter, index, dbType, tableReference, columns) {
|
|
20
19
|
const paramName = `filter_${index}`;
|
|
21
|
-
const
|
|
20
|
+
const columnRef = tableReference
|
|
21
|
+
? `${(0, sql_utils_1.quoteIdentifier)(tableReference, dbType)}.${(0, sql_utils_1.quoteIdentifier)(filter.columnName, dbType)}`
|
|
22
|
+
: (0, sql_utils_1.quoteIdentifier)(filter.columnName, dbType);
|
|
22
23
|
if (filter.value === null) {
|
|
23
24
|
switch (filter.condition) {
|
|
24
25
|
case 'eq':
|
|
25
|
-
return [`${
|
|
26
|
+
return [`${columnRef} IS NULL`, {}];
|
|
26
27
|
case 'neq':
|
|
27
|
-
return [`${
|
|
28
|
+
return [`${columnRef} IS NOT NULL`, {}];
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
const columnInfo = columns?.find((col) => col.name === filter.columnName);
|
|
@@ -38,63 +39,93 @@ function getConditionAndParams(filter, index, dbType, columns) {
|
|
|
38
39
|
lte: '<=',
|
|
39
40
|
};
|
|
40
41
|
if (operators[filter.condition]) {
|
|
41
|
-
return [`${
|
|
42
|
+
return [`${columnRef} ${operators[filter.condition]} :${paramName}`, { [paramName]: value }];
|
|
42
43
|
}
|
|
43
44
|
switch (filter.condition) {
|
|
44
45
|
case 'like':
|
|
45
46
|
if (['sqlite', 'sqlite-pooled'].includes(dbType)) {
|
|
46
47
|
const globValue = (0, sql_utils_1.toSqliteGlobFromPercent)(value);
|
|
47
|
-
return [`${
|
|
48
|
+
return [`${columnRef} GLOB :${paramName}`, { [paramName]: globValue }];
|
|
48
49
|
}
|
|
49
50
|
if (['mysql', 'mariadb'].includes(dbType)) {
|
|
50
51
|
const escapedValue = (0, sql_utils_1.escapeLikeSpecials)(value);
|
|
51
|
-
return [
|
|
52
|
+
return [
|
|
53
|
+
`${columnRef} LIKE BINARY :${paramName} ESCAPE '\\\\'`,
|
|
54
|
+
{ [paramName]: escapedValue },
|
|
55
|
+
];
|
|
52
56
|
}
|
|
53
57
|
if (dbType === 'postgres') {
|
|
54
58
|
const escapedValue = (0, sql_utils_1.escapeLikeSpecials)(value);
|
|
55
|
-
return [`${
|
|
59
|
+
return [`${columnRef} LIKE :${paramName} ESCAPE '\\'`, { [paramName]: escapedValue }];
|
|
56
60
|
}
|
|
57
|
-
return [`${
|
|
61
|
+
return [`${columnRef} LIKE :${paramName}`, { [paramName]: value }];
|
|
58
62
|
case 'ilike':
|
|
59
63
|
if (['sqlite', 'sqlite-pooled'].includes(dbType)) {
|
|
60
64
|
const escapedValue = (0, sql_utils_1.escapeLikeSpecials)(value);
|
|
61
65
|
return [
|
|
62
|
-
`UPPER(${
|
|
66
|
+
`UPPER(${columnRef}) LIKE UPPER(:${paramName}) ESCAPE '\\'`,
|
|
63
67
|
{ [paramName]: escapedValue },
|
|
64
68
|
];
|
|
65
69
|
}
|
|
66
70
|
if (['mysql', 'mariadb'].includes(dbType)) {
|
|
67
71
|
const escapedValue = (0, sql_utils_1.escapeLikeSpecials)(value);
|
|
68
72
|
return [
|
|
69
|
-
`UPPER(${
|
|
73
|
+
`UPPER(${columnRef}) LIKE UPPER(:${paramName}) ESCAPE '\\\\'`,
|
|
70
74
|
{ [paramName]: escapedValue },
|
|
71
75
|
];
|
|
72
76
|
}
|
|
73
77
|
if (dbType === 'postgres') {
|
|
74
78
|
const escapedValue = (0, sql_utils_1.escapeLikeSpecials)(value);
|
|
75
|
-
return [`${
|
|
79
|
+
return [`${columnRef} ILIKE :${paramName} ESCAPE '\\'`, { [paramName]: escapedValue }];
|
|
76
80
|
}
|
|
77
|
-
return [`UPPER(${
|
|
81
|
+
return [`UPPER(${columnRef}) LIKE UPPER(:${paramName})`, { [paramName]: value }];
|
|
78
82
|
}
|
|
79
83
|
throw new Error(`Unsupported filter condition: ${filter.condition}`);
|
|
80
84
|
}
|
|
81
85
|
let DataStoreRowsRepository = class DataStoreRowsRepository {
|
|
82
|
-
constructor(dataSource
|
|
86
|
+
constructor(dataSource) {
|
|
83
87
|
this.dataSource = dataSource;
|
|
84
|
-
this.globalConfig = globalConfig;
|
|
85
88
|
}
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
+
async insertRowsBulk(table, rows, columns, em) {
|
|
90
|
+
const batchSize = 800;
|
|
91
|
+
const batches = Math.max(1, Math.ceil((columns.length * rows.length) / batchSize));
|
|
92
|
+
const rowsPerBatch = Math.ceil(rows.length / batches);
|
|
93
|
+
const columnNames = columns.map((x) => x.name);
|
|
94
|
+
const dbType = this.dataSource.options.type;
|
|
95
|
+
let insertedRows = 0;
|
|
96
|
+
for (let i = 0; i < batches; ++i) {
|
|
97
|
+
const start = i * rowsPerBatch;
|
|
98
|
+
const endExclusive = Math.min(rows.length, (i + 1) * rowsPerBatch);
|
|
99
|
+
if (endExclusive <= start)
|
|
100
|
+
break;
|
|
101
|
+
const completeRows = new Array(endExclusive - start);
|
|
102
|
+
for (let j = start; j < endExclusive; ++j) {
|
|
103
|
+
const insertArray = [];
|
|
104
|
+
for (let h = 0; h < columnNames.length; ++h) {
|
|
105
|
+
const column = columns[h];
|
|
106
|
+
const value = rows[j][column.name] ?? null;
|
|
107
|
+
insertArray[h] = (0, sql_utils_1.normalizeValue)(value, column.type, dbType);
|
|
108
|
+
}
|
|
109
|
+
completeRows[j - start] = insertArray;
|
|
110
|
+
}
|
|
111
|
+
const query = em.createQueryBuilder().insert().into(table, columnNames).values(completeRows);
|
|
112
|
+
await query.execute();
|
|
113
|
+
insertedRows += completeRows.length;
|
|
114
|
+
}
|
|
115
|
+
return { success: true, insertedRows };
|
|
89
116
|
}
|
|
90
|
-
async insertRows(dataStoreId, rows, columns,
|
|
117
|
+
async insertRows(dataStoreId, rows, columns, returnType, em) {
|
|
118
|
+
em = em ?? this.dataSource.manager;
|
|
91
119
|
const inserted = [];
|
|
92
120
|
const dbType = this.dataSource.options.type;
|
|
93
121
|
const useReturning = dbType === 'postgres' || dbType === 'mariadb';
|
|
94
|
-
const table =
|
|
122
|
+
const table = (0, sql_utils_1.toTableName)(dataStoreId);
|
|
95
123
|
const escapedColumns = columns.map((c) => this.dataSource.driver.escape(c.name));
|
|
96
124
|
const escapedSystemColumns = n8n_workflow_1.DATA_TABLE_SYSTEM_COLUMNS.map((x) => this.dataSource.driver.escape(x));
|
|
97
125
|
const selectColumns = [...escapedSystemColumns, ...escapedColumns];
|
|
126
|
+
if (returnType === 'count') {
|
|
127
|
+
return await this.insertRowsBulk(table, rows, columns, em);
|
|
128
|
+
}
|
|
98
129
|
for (const row of rows) {
|
|
99
130
|
const completeRow = { ...row };
|
|
100
131
|
for (const column of columns) {
|
|
@@ -103,13 +134,13 @@ let DataStoreRowsRepository = class DataStoreRowsRepository {
|
|
|
103
134
|
}
|
|
104
135
|
completeRow[column.name] = (0, sql_utils_1.normalizeValue)(completeRow[column.name], column.type, dbType);
|
|
105
136
|
}
|
|
106
|
-
const query =
|
|
137
|
+
const query = em.createQueryBuilder().insert().into(table).values(completeRow);
|
|
107
138
|
if (useReturning) {
|
|
108
|
-
query.returning(
|
|
139
|
+
query.returning(returnType === 'all' ? selectColumns.join(',') : 'id');
|
|
109
140
|
}
|
|
110
141
|
const result = await query.execute();
|
|
111
142
|
if (useReturning) {
|
|
112
|
-
const returned =
|
|
143
|
+
const returned = returnType === 'all'
|
|
113
144
|
? (0, sql_utils_1.normalizeRows)((0, sql_utils_1.extractReturningData)(result.raw), columns)
|
|
114
145
|
: (0, sql_utils_1.extractInsertedIds)(result.raw, dbType).map((id) => ({ id }));
|
|
115
146
|
inserted.push.apply(inserted, returned);
|
|
@@ -119,41 +150,39 @@ let DataStoreRowsRepository = class DataStoreRowsRepository {
|
|
|
119
150
|
if (ids.length === 0) {
|
|
120
151
|
throw new n8n_workflow_1.UnexpectedError("Couldn't find the inserted row ID");
|
|
121
152
|
}
|
|
122
|
-
if (
|
|
153
|
+
if (returnType === 'id') {
|
|
123
154
|
inserted.push(...ids.map((id) => ({ id })));
|
|
124
155
|
continue;
|
|
125
156
|
}
|
|
126
|
-
const insertedRows = await this.getManyByIds(dataStoreId, ids, columns);
|
|
157
|
+
const insertedRows = await this.getManyByIds(dataStoreId, ids, columns, em);
|
|
127
158
|
inserted.push(...insertedRows);
|
|
128
159
|
}
|
|
129
160
|
return inserted;
|
|
130
161
|
}
|
|
131
|
-
async updateRow(dataStoreId,
|
|
162
|
+
async updateRow(dataStoreId, data, filter, columns, returnData = false, em) {
|
|
163
|
+
em = em ?? this.dataSource.manager;
|
|
132
164
|
const dbType = this.dataSource.options.type;
|
|
133
165
|
const useReturning = dbType === 'postgres';
|
|
134
|
-
const table =
|
|
166
|
+
const table = (0, sql_utils_1.toTableName)(dataStoreId);
|
|
135
167
|
const escapedColumns = columns.map((c) => this.dataSource.driver.escape(c.name));
|
|
136
168
|
const escapedSystemColumns = n8n_workflow_1.DATA_TABLE_SYSTEM_COLUMNS.map((x) => this.dataSource.driver.escape(x));
|
|
137
169
|
const selectColumns = [...escapedSystemColumns, ...escapedColumns];
|
|
170
|
+
const setData = { ...data };
|
|
138
171
|
for (const column of columns) {
|
|
139
172
|
if (column.name in setData) {
|
|
140
173
|
setData[column.name] = (0, sql_utils_1.normalizeValue)(setData[column.name], column.type, dbType);
|
|
141
174
|
}
|
|
142
|
-
if (column.name in whereData) {
|
|
143
|
-
whereData[column.name] = (0, sql_utils_1.normalizeValue)(whereData[column.name], column.type, dbType);
|
|
144
|
-
}
|
|
145
175
|
}
|
|
146
176
|
let affectedRows = [];
|
|
147
177
|
if (!useReturning && returnData) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
.from(table, 'dataStore')
|
|
152
|
-
.where(whereData)
|
|
153
|
-
.getRawMany();
|
|
178
|
+
const selectQuery = em.createQueryBuilder().select('id').from(table, 'dataTable');
|
|
179
|
+
this.applyFilters(selectQuery, filter, 'dataTable', columns);
|
|
180
|
+
affectedRows = await selectQuery.getRawMany();
|
|
154
181
|
}
|
|
155
182
|
setData.updatedAt = (0, sql_utils_1.normalizeValue)(new Date(), 'date', dbType);
|
|
156
|
-
const query =
|
|
183
|
+
const query = em.createQueryBuilder().update(table);
|
|
184
|
+
this.applyFilters(query, filter, undefined, columns);
|
|
185
|
+
query.set(setData);
|
|
157
186
|
if (useReturning && returnData) {
|
|
158
187
|
query.returning(selectColumns.join(','));
|
|
159
188
|
}
|
|
@@ -165,109 +194,116 @@ let DataStoreRowsRepository = class DataStoreRowsRepository {
|
|
|
165
194
|
return (0, sql_utils_1.normalizeRows)((0, sql_utils_1.extractReturningData)(result.raw), columns);
|
|
166
195
|
}
|
|
167
196
|
const ids = affectedRows.map((row) => row.id);
|
|
168
|
-
return await this.getManyByIds(dataStoreId, ids, columns);
|
|
197
|
+
return await this.getManyByIds(dataStoreId, ids, columns, em);
|
|
169
198
|
}
|
|
170
|
-
async
|
|
171
|
-
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
if (
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
if (rowsToUpdate.length > 0) {
|
|
181
|
-
for (const row of rowsToUpdate) {
|
|
182
|
-
const updateKeys = Object.keys(row).filter((key) => !matchFields.includes(key));
|
|
183
|
-
if (updateKeys.length === 0) {
|
|
184
|
-
return true;
|
|
185
|
-
}
|
|
186
|
-
const setData = Object.fromEntries(updateKeys.map((key) => [key, row[key]]));
|
|
187
|
-
const whereData = Object.fromEntries(matchFields.map((key) => [key, row[key]]));
|
|
188
|
-
const result = await this.updateRow(dataStoreId, setData, whereData, columns, returnData);
|
|
189
|
-
if (returnData) {
|
|
190
|
-
output.push.apply(output, result);
|
|
199
|
+
async deleteRows(dataTableId, columns, filter, returnData = false) {
|
|
200
|
+
const dbType = this.dataSource.options.type;
|
|
201
|
+
const useReturning = dbType === 'postgres';
|
|
202
|
+
const table = (0, sql_utils_1.toTableName)(dataTableId);
|
|
203
|
+
if (!returnData) {
|
|
204
|
+
await this.dataSource.manager.transaction(async (em) => {
|
|
205
|
+
const query = em.createQueryBuilder().delete().from(table, 'dataTable');
|
|
206
|
+
if (filter) {
|
|
207
|
+
this.applyFilters(query, filter, undefined, columns);
|
|
191
208
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
return returnData ? output : true;
|
|
195
|
-
}
|
|
196
|
-
async deleteRows(dataStoreId, ids) {
|
|
197
|
-
if (ids.length === 0) {
|
|
209
|
+
await query.execute();
|
|
210
|
+
});
|
|
198
211
|
return true;
|
|
199
212
|
}
|
|
200
|
-
|
|
201
|
-
await this.dataSource
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
213
|
+
let affectedRows = [];
|
|
214
|
+
await this.dataSource.manager.transaction(async (em) => {
|
|
215
|
+
if (!useReturning) {
|
|
216
|
+
const selectQuery = em.createQueryBuilder().select('*').from(table, 'dataTable');
|
|
217
|
+
if (filter) {
|
|
218
|
+
this.applyFilters(selectQuery, filter, 'dataTable', columns);
|
|
219
|
+
}
|
|
220
|
+
const rawRows = await selectQuery.getRawMany();
|
|
221
|
+
affectedRows = (0, sql_utils_1.normalizeRows)(rawRows, columns);
|
|
222
|
+
}
|
|
223
|
+
const query = em.createQueryBuilder().delete().from(table, 'dataTable');
|
|
224
|
+
if (useReturning) {
|
|
225
|
+
const escapedColumns = columns.map((c) => this.dataSource.driver.escape(c.name));
|
|
226
|
+
const escapedSystemColumns = n8n_workflow_1.DATA_TABLE_SYSTEM_COLUMNS.map((x) => this.dataSource.driver.escape(x));
|
|
227
|
+
const selectColumns = [...escapedSystemColumns, ...escapedColumns];
|
|
228
|
+
query.returning(selectColumns.join(','));
|
|
229
|
+
}
|
|
230
|
+
if (filter) {
|
|
231
|
+
this.applyFilters(query, filter, undefined, columns);
|
|
232
|
+
}
|
|
233
|
+
const result = await query.execute();
|
|
234
|
+
if (useReturning) {
|
|
235
|
+
affectedRows = (0, sql_utils_1.normalizeRows)((0, sql_utils_1.extractReturningData)(result.raw), columns);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
return affectedRows;
|
|
208
239
|
}
|
|
209
240
|
async createTableWithColumns(dataStoreId, columns, queryRunner) {
|
|
210
241
|
const dslColumns = [new db_1.DslColumn('id').int.autoGenerate2.primary, ...(0, sql_utils_1.toDslColumns)(columns)];
|
|
211
|
-
const createTable = new db_1.CreateTable(
|
|
242
|
+
const createTable = new db_1.CreateTable((0, sql_utils_1.toTableName)(dataStoreId), '', queryRunner).withColumns(...dslColumns).withTimestamps;
|
|
212
243
|
await createTable.execute(queryRunner);
|
|
213
244
|
}
|
|
214
245
|
async dropTable(dataStoreId, queryRunner) {
|
|
215
|
-
await queryRunner.dropTable(
|
|
246
|
+
await queryRunner.dropTable((0, sql_utils_1.toTableName)(dataStoreId), true);
|
|
216
247
|
}
|
|
217
248
|
async addColumn(dataStoreId, column, queryRunner, dbType) {
|
|
218
|
-
await queryRunner.query((0, sql_utils_1.addColumnQuery)(
|
|
249
|
+
await queryRunner.query((0, sql_utils_1.addColumnQuery)((0, sql_utils_1.toTableName)(dataStoreId), column, dbType));
|
|
219
250
|
}
|
|
220
251
|
async dropColumnFromTable(dataStoreId, columnName, queryRunner, dbType) {
|
|
221
|
-
await queryRunner.query((0, sql_utils_1.deleteColumnQuery)(
|
|
252
|
+
await queryRunner.query((0, sql_utils_1.deleteColumnQuery)((0, sql_utils_1.toTableName)(dataStoreId), columnName, dbType));
|
|
222
253
|
}
|
|
223
|
-
async getManyAndCount(dataStoreId, dto, columns) {
|
|
224
|
-
|
|
254
|
+
async getManyAndCount(dataStoreId, dto, columns, em) {
|
|
255
|
+
em = em ?? this.dataSource.manager;
|
|
256
|
+
const [countQuery, query] = this.getManyQuery(dataStoreId, dto, em, columns);
|
|
225
257
|
const data = await query.select('*').getRawMany();
|
|
226
258
|
const countResult = await countQuery.select('COUNT(*) as count').getRawOne();
|
|
227
259
|
const count = typeof countResult?.count === 'number' ? countResult.count : Number(countResult?.count) || 0;
|
|
228
260
|
return { count: count ?? -1, data };
|
|
229
261
|
}
|
|
230
|
-
async getManyByIds(dataStoreId, ids, columns) {
|
|
231
|
-
const table =
|
|
262
|
+
async getManyByIds(dataStoreId, ids, columns, em) {
|
|
263
|
+
const table = (0, sql_utils_1.toTableName)(dataStoreId);
|
|
232
264
|
const escapedColumns = columns.map((c) => this.dataSource.driver.escape(c.name));
|
|
233
265
|
const escapedSystemColumns = n8n_workflow_1.DATA_TABLE_SYSTEM_COLUMNS.map((x) => this.dataSource.driver.escape(x));
|
|
234
266
|
const selectColumns = [...escapedSystemColumns, ...escapedColumns];
|
|
235
267
|
if (ids.length === 0) {
|
|
236
268
|
return [];
|
|
237
269
|
}
|
|
238
|
-
const updatedRows = await
|
|
270
|
+
const updatedRows = await em
|
|
239
271
|
.createQueryBuilder()
|
|
240
272
|
.select(selectColumns)
|
|
241
|
-
.from(table, '
|
|
273
|
+
.from(table, 'dataTable')
|
|
242
274
|
.where({ id: (0, typeorm_1.In)(ids) })
|
|
243
275
|
.getRawMany();
|
|
244
276
|
return (0, sql_utils_1.normalizeRows)(updatedRows, columns);
|
|
245
277
|
}
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
const
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
query.from(this.toTableName(dataStoreId), 'dataStore');
|
|
254
|
-
this.applyFilters(query, dto, columns);
|
|
278
|
+
getManyQuery(dataStoreId, dto, em, columns) {
|
|
279
|
+
const query = em.createQueryBuilder();
|
|
280
|
+
const tableReference = 'dataTable';
|
|
281
|
+
query.from((0, sql_utils_1.toTableName)(dataStoreId), tableReference);
|
|
282
|
+
if (dto.filter) {
|
|
283
|
+
this.applyFilters(query, dto.filter, tableReference, columns);
|
|
284
|
+
}
|
|
255
285
|
const countQuery = query.clone().select('COUNT(*)');
|
|
256
286
|
this.applySorting(query, dto);
|
|
257
287
|
this.applyPagination(query, dto);
|
|
258
288
|
return [countQuery, query];
|
|
259
289
|
}
|
|
260
|
-
applyFilters(query,
|
|
261
|
-
const filters =
|
|
262
|
-
const filterType =
|
|
290
|
+
applyFilters(query, filter, tableReference, columns) {
|
|
291
|
+
const filters = filter.filters ?? [];
|
|
292
|
+
const filterType = filter.type ?? 'and';
|
|
263
293
|
const dbType = this.dataSource.options.type;
|
|
264
|
-
const conditionsAndParams = filters.map((filter, i) => getConditionAndParams(filter, i, dbType, columns));
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
294
|
+
const conditionsAndParams = filters.map((filter, i) => getConditionAndParams(filter, i, dbType, tableReference, columns));
|
|
295
|
+
if (conditionsAndParams.length === 1) {
|
|
296
|
+
const [condition, params] = conditionsAndParams[0];
|
|
297
|
+
query.andWhere(condition, params);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
for (const [condition, params] of conditionsAndParams) {
|
|
301
|
+
if (filterType === 'or') {
|
|
302
|
+
query.orWhere(condition, params);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
query.andWhere(condition, params);
|
|
306
|
+
}
|
|
271
307
|
}
|
|
272
308
|
}
|
|
273
309
|
}
|
|
@@ -280,35 +316,18 @@ let DataStoreRowsRepository = class DataStoreRowsRepository {
|
|
|
280
316
|
}
|
|
281
317
|
applySortingByField(query, field, direction) {
|
|
282
318
|
const dbType = this.dataSource.options.type;
|
|
283
|
-
const quotedField = `${(0, sql_utils_1.quoteIdentifier)('
|
|
319
|
+
const quotedField = `${(0, sql_utils_1.quoteIdentifier)('dataTable', dbType)}.${(0, sql_utils_1.quoteIdentifier)(field, dbType)}`;
|
|
284
320
|
query.orderBy(quotedField, direction);
|
|
285
321
|
}
|
|
286
322
|
applyPagination(query, dto) {
|
|
287
|
-
query.skip(dto.skip);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
async fetchAndSplitRowsByExistence(dataStoreId, matchFields, rows) {
|
|
291
|
-
const queryBuilder = this.dataSource
|
|
292
|
-
.createQueryBuilder()
|
|
293
|
-
.select(matchFields)
|
|
294
|
-
.from(this.toTableName(dataStoreId), 'datastore');
|
|
295
|
-
rows.forEach((row, index) => {
|
|
296
|
-
const matchData = Object.fromEntries(matchFields.map((field) => [field, row[field]]));
|
|
297
|
-
if (index === 0) {
|
|
298
|
-
queryBuilder.where(matchData);
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
queryBuilder.orWhere(matchData);
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
const existing = await queryBuilder.getRawMany();
|
|
305
|
-
return (0, sql_utils_1.splitRowsByExistence)(existing, matchFields, rows);
|
|
323
|
+
query.skip(dto.skip ?? 0);
|
|
324
|
+
if (dto.take)
|
|
325
|
+
query.take(dto.take);
|
|
306
326
|
}
|
|
307
327
|
};
|
|
308
328
|
exports.DataStoreRowsRepository = DataStoreRowsRepository;
|
|
309
329
|
exports.DataStoreRowsRepository = DataStoreRowsRepository = __decorate([
|
|
310
330
|
(0, di_1.Service)(),
|
|
311
|
-
__metadata("design:paramtypes", [typeorm_1.DataSource
|
|
312
|
-
config_1.GlobalConfig])
|
|
331
|
+
__metadata("design:paramtypes", [typeorm_1.DataSource])
|
|
313
332
|
], DataStoreRowsRepository);
|
|
314
333
|
//# sourceMappingURL=data-store-rows.repository.js.map
|