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.
Files changed (148) hide show
  1. package/dist/auth/auth.service.js +2 -0
  2. package/dist/auth/auth.service.js.map +1 -1
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/commands/start.d.ts +1 -0
  5. package/dist/commands/start.js +17 -0
  6. package/dist/commands/start.js.map +1 -1
  7. package/dist/constants.d.ts +2 -0
  8. package/dist/constants.js +3 -1
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controllers/dynamic-node-parameters.controller.js +6 -16
  11. package/dist/controllers/dynamic-node-parameters.controller.js.map +1 -1
  12. package/dist/controllers/e2e.controller.js +1 -0
  13. package/dist/controllers/e2e.controller.js.map +1 -1
  14. package/dist/controllers/folder.controller.d.ts +7 -2
  15. package/dist/controllers/folder.controller.js +24 -3
  16. package/dist/controllers/folder.controller.js.map +1 -1
  17. package/dist/controllers/role.controller.d.ts +5 -4
  18. package/dist/controllers/role.controller.js +21 -15
  19. package/dist/controllers/role.controller.js.map +1 -1
  20. package/dist/environments.ee/source-control/source-control.service.ee.js +2 -5
  21. package/dist/environments.ee/source-control/source-control.service.ee.js.map +1 -1
  22. package/dist/events/maps/relay.event-map.d.ts +4 -0
  23. package/dist/execution-lifecycle/execution-lifecycle-hooks.js +8 -1
  24. package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
  25. package/dist/executions/execution-recovery.service.js +2 -1
  26. package/dist/executions/execution-recovery.service.js.map +1 -1
  27. package/dist/executions/execution.service.d.ts +2 -2
  28. package/dist/executions/execution.service.js +14 -1
  29. package/dist/executions/execution.service.js.map +1 -1
  30. package/dist/executions/execution.types.d.ts +2 -5
  31. package/dist/executions/executions.controller.d.ts +2 -2
  32. package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -0
  33. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +6 -0
  34. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
  35. package/dist/modules/community-packages/npm-utils.js +10 -0
  36. package/dist/modules/community-packages/npm-utils.js.map +1 -1
  37. package/dist/modules/data-table/data-store-aggregate.controller.d.ts +7 -1
  38. package/dist/modules/data-table/data-store-aggregate.controller.js +15 -2
  39. package/dist/modules/data-table/data-store-aggregate.controller.js.map +1 -1
  40. package/dist/modules/data-table/data-store-column.repository.js +1 -1
  41. package/dist/modules/data-table/data-store-column.repository.js.map +1 -1
  42. package/dist/modules/data-table/data-store-proxy.service.d.ts +3 -3
  43. package/dist/modules/data-table/data-store-proxy.service.js +13 -13
  44. package/dist/modules/data-table/data-store-proxy.service.js.map +1 -1
  45. package/dist/modules/data-table/data-store-rows.repository.d.ts +13 -20
  46. package/dist/modules/data-table/data-store-rows.repository.js +144 -125
  47. package/dist/modules/data-table/data-store-rows.repository.js.map +1 -1
  48. package/dist/modules/data-table/data-store-size-validator.service.d.ts +16 -0
  49. package/dist/modules/data-table/data-store-size-validator.service.js +79 -0
  50. package/dist/modules/data-table/data-store-size-validator.service.js.map +1 -0
  51. package/dist/modules/data-table/data-store.controller.d.ts +9 -9
  52. package/dist/modules/data-table/data-store.controller.js +16 -14
  53. package/dist/modules/data-table/data-store.controller.js.map +1 -1
  54. package/dist/modules/data-table/data-store.repository.d.ts +4 -1
  55. package/dist/modules/data-table/data-store.repository.js +47 -5
  56. package/dist/modules/data-table/data-store.repository.js.map +1 -1
  57. package/dist/modules/data-table/data-store.service.d.ts +19 -11
  58. package/dist/modules/data-table/data-store.service.js +102 -73
  59. package/dist/modules/data-table/data-store.service.js.map +1 -1
  60. package/dist/modules/data-table/data-store.types.d.ts +2 -0
  61. package/dist/modules/data-table/data-store.types.js +7 -0
  62. package/dist/modules/data-table/data-store.types.js.map +1 -1
  63. package/dist/modules/data-table/data-table.module.js +1 -1
  64. package/dist/modules/data-table/utils/sql-utils.d.ts +2 -5
  65. package/dist/modules/data-table/utils/sql-utils.js +7 -17
  66. package/dist/modules/data-table/utils/sql-utils.js.map +1 -1
  67. package/dist/public-api/types.d.ts +5 -0
  68. package/dist/public-api/v1/handlers/executions/executions.handler.d.ts +1 -0
  69. package/dist/public-api/v1/handlers/executions/executions.handler.js +34 -1
  70. package/dist/public-api/v1/handlers/executions/executions.handler.js.map +1 -1
  71. package/dist/public-api/v1/openapi.yml +60 -7
  72. package/dist/push/abstract.push.d.ts +2 -2
  73. package/dist/push/abstract.push.js +4 -4
  74. package/dist/push/abstract.push.js.map +1 -1
  75. package/dist/push/index.d.ts +3 -2
  76. package/dist/push/index.js +30 -26
  77. package/dist/push/index.js.map +1 -1
  78. package/dist/push/origin-validator.d.ts +13 -0
  79. package/dist/push/origin-validator.js +145 -0
  80. package/dist/push/origin-validator.js.map +1 -0
  81. package/dist/push/websocket.push.d.ts +1 -1
  82. package/dist/push/websocket.push.js +2 -2
  83. package/dist/push/websocket.push.js.map +1 -1
  84. package/dist/scaling/constants.d.ts +2 -2
  85. package/dist/scaling/pubsub/pubsub.event-map.d.ts +2 -0
  86. package/dist/scaling/pubsub/pubsub.registry.d.ts +1 -0
  87. package/dist/scaling/pubsub/pubsub.registry.js +9 -2
  88. package/dist/scaling/pubsub/pubsub.registry.js.map +1 -1
  89. package/dist/scaling/pubsub/pubsub.types.d.ts +2 -1
  90. package/dist/scaling/scaling.service.d.ts +1 -1
  91. package/dist/scaling/scaling.service.js +0 -4
  92. package/dist/scaling/scaling.service.js.map +1 -1
  93. package/dist/server.js +22 -23
  94. package/dist/server.js.map +1 -1
  95. package/dist/services/dynamic-node-parameters.service.d.ts +7 -1
  96. package/dist/services/dynamic-node-parameters.service.js +15 -2
  97. package/dist/services/dynamic-node-parameters.service.js.map +1 -1
  98. package/dist/services/frontend.service.js +5 -0
  99. package/dist/services/frontend.service.js.map +1 -1
  100. package/dist/services/ownership.service.d.ts +1 -0
  101. package/dist/services/ownership.service.js +6 -0
  102. package/dist/services/ownership.service.js.map +1 -1
  103. package/dist/services/public-api-key.service.js +2 -0
  104. package/dist/services/public-api-key.service.js.map +1 -1
  105. package/dist/services/role.service.d.ts +2 -2
  106. package/dist/services/role.service.js +3 -3
  107. package/dist/services/role.service.js.map +1 -1
  108. package/dist/sso.ee/oidc/oidc.service.ee.d.ts +25 -4
  109. package/dist/sso.ee/oidc/oidc.service.ee.js +167 -22
  110. package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
  111. package/dist/sso.ee/oidc/routes/oidc.controller.ee.d.ts +6 -2
  112. package/dist/sso.ee/oidc/routes/oidc.controller.ee.js +41 -7
  113. package/dist/sso.ee/oidc/routes/oidc.controller.ee.js.map +1 -1
  114. package/dist/sso.ee/sso-helpers.d.ts +1 -0
  115. package/dist/sso.ee/sso-helpers.js +19 -0
  116. package/dist/sso.ee/sso-helpers.js.map +1 -1
  117. package/dist/task-runners/errors/missing-requirements.error.d.ts +6 -0
  118. package/dist/task-runners/errors/missing-requirements.error.js +17 -0
  119. package/dist/task-runners/errors/missing-requirements.error.js.map +1 -0
  120. package/dist/task-runners/internal-task-runner-disconnect-analyzer.d.ts +2 -2
  121. package/dist/task-runners/internal-task-runner-disconnect-analyzer.js +2 -2
  122. package/dist/task-runners/internal-task-runner-disconnect-analyzer.js.map +1 -1
  123. package/dist/task-runners/task-runner-module.d.ts +5 -3
  124. package/dist/task-runners/task-runner-module.js +25 -13
  125. package/dist/task-runners/task-runner-module.js.map +1 -1
  126. package/dist/task-runners/task-runner-process-base.d.ts +39 -0
  127. package/dist/task-runners/task-runner-process-base.js +111 -0
  128. package/dist/task-runners/task-runner-process-base.js.map +1 -0
  129. package/dist/task-runners/task-runner-process-js.d.ts +21 -0
  130. package/dist/task-runners/{task-runner-process.js → task-runner-process-js.js} +35 -108
  131. package/dist/task-runners/task-runner-process-js.js.map +1 -0
  132. package/dist/task-runners/task-runner-process-py.d.ts +15 -0
  133. package/dist/task-runners/task-runner-process-py.js +76 -0
  134. package/dist/task-runners/task-runner-process-py.js.map +1 -0
  135. package/dist/task-runners/task-runner-process-restart-loop-detector.d.ts +2 -2
  136. package/dist/task-runners/task-runner-process-restart-loop-detector.js.map +1 -1
  137. package/dist/user-management/email/templates/credentials-shared.handlebars +48 -40
  138. package/dist/user-management/email/templates/n8n-logo.png +0 -0
  139. package/dist/user-management/email/templates/password-reset-requested.handlebars +68 -60
  140. package/dist/user-management/email/templates/project-shared.handlebars +43 -35
  141. package/dist/user-management/email/templates/user-invited.handlebars +48 -40
  142. package/dist/user-management/email/templates/workflow-shared.handlebars +48 -40
  143. package/dist/workflows/workflow.request.d.ts +1 -0
  144. package/dist/workflows/workflow.service.ee.js +1 -0
  145. package/dist/workflows/workflow.service.ee.js.map +1 -1
  146. package/package.json +24 -18
  147. package/dist/task-runners/task-runner-process.d.ts +0 -36
  148. 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, dataStoreProjectId?: string): Promise<IDataStoreProjectAggregateService>;
13
- getDataStoreProxy(workflow: Workflow, node: INode, dataStoreId: string, dataStoreProjectId?: string): Promise<IDataStoreProjectService>;
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 data table nodes');
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, dataStoreProjectId) {
33
+ async getDataStoreAggregateProxy(workflow, node, projectId) {
34
34
  this.validateRequest(node);
35
- const projectId = dataStoreProjectId ?? (await this.getProjectId(workflow));
35
+ projectId = projectId ?? (await this.getProjectId(workflow));
36
36
  return this.makeAggregateOperations(projectId);
37
37
  }
38
- async getDataStoreProxy(workflow, node, dataStoreId, dataStoreProjectId) {
38
+ async getDataStoreProxy(workflow, node, dataStoreId, projectId) {
39
39
  this.validateRequest(node);
40
- const projectId = dataStoreProjectId ?? (await this.getProjectId(workflow));
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, true);
88
+ async insertRows(rows, returnType) {
89
+ return await dataStoreService.insertRows(dataStoreId, projectId, rows, returnType);
90
90
  },
91
- async updateRows(options) {
91
+ async updateRow(options) {
92
92
  return await dataStoreService.updateRow(dataStoreId, projectId, options, true);
93
93
  },
94
- async upsertRows(options) {
95
- return await dataStoreService.upsertRows(dataStoreId, projectId, options, true);
94
+ async upsertRow(options) {
95
+ return await dataStoreService.upsertRow(dataStoreId, projectId, options, true);
96
96
  },
97
- async deleteRows(ids) {
98
- return await dataStoreService.deleteRows(dataStoreId, projectId, ids);
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;AAoBlC,6DAAwD;AAExD,oEAAgE;AAGzD,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACjC,YACkB,gBAAkC,EAClC,gBAAkC,EAClC,MAAc;QAFd,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAEO,eAAe,CAAC,IAAW;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B,IAAI,IAAI,CAAC,IAAI,KAAK,8BAA8B,EAAE,CAAC;YAC9F,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACtE,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAkB;QAC5C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtF,OAAO,WAAW,CAAC,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC/B,QAAkB,EAClB,IAAW,EACX,kBAA2B;QAE3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,kBAAkB,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,iBAAiB,CACtB,QAAkB,EAClB,IAAW,EACX,WAAmB,EACnB,kBAA2B;QAE3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,kBAAkB,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAEO,uBAAuB,CAAC,SAAiB;QAChD,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC/C,OAAO;YACN,YAAY;gBACX,OAAO,SAAS,CAAC;YAClB,CAAC;YAED,KAAK,CAAC,eAAe,CAAC,UAAgC,EAAE;gBACvD,MAAM,cAAc,GAAyB;oBAC5C,GAAG,OAAO;oBACV,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;iBAChD,CAAC;gBACF,OAAO,MAAM,gBAAgB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC/D,CAAC;YAED,KAAK,CAAC,eAAe,CAAC,OAA+B;gBACpD,OAAO,MAAM,gBAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnE,CAAC;YAED,KAAK,CAAC,kBAAkB;gBACvB,OAAO,MAAM,gBAAgB,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;YACrE,CAAC;SACD,CAAC;IACH,CAAC;IAEO,uBAAuB,CAC9B,SAAiB,EACjB,WAAmB;QAEnB,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAE/C,OAAO;YAEN,KAAK,CAAC,eAAe,CAAC,OAA+B;gBACpD,OAAO,MAAM,gBAAgB,CAAC,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAChF,CAAC;YAED,KAAK,CAAC,eAAe;gBACpB,OAAO,MAAM,gBAAgB,CAAC,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;YAGD,KAAK,CAAC,UAAU;gBACf,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAClE,CAAC;YAED,KAAK,CAAC,SAAS,CAAC,OAAkC;gBACjD,OAAO,MAAM,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1E,CAAC;YAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,OAAmC;gBACrE,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrF,CAAC;YAED,KAAK,CAAC,YAAY,CAAC,QAAgB;gBAClC,OAAO,MAAM,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC9E,CAAC;YAGD,KAAK,CAAC,mBAAmB,CAAC,OAA0C;gBACnE,OAAO,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACpF,CAAC;YAED,KAAK,CAAC,UAAU,CAAC,IAAmB;gBACnC,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9E,CAAC;YAED,KAAK,CAAC,UAAU,CAAC,OAAmC;gBACnD,OAAO,MAAM,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAChF,CAAC;YAED,KAAK,CAAC,UAAU,CAAC,OAAmC;gBACnD,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACjF,CAAC;YAED,KAAK,CAAC,UAAU,CAAC,GAAa;gBAC7B,OAAO,MAAM,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;SACD,CAAC;IACH,CAAC;CACD,CAAA;AA3HY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,YAAO,GAAE;qCAG2B,qCAAgB;QAChB,oCAAgB;QAC1B,uBAAM;GAJpB,qBAAqB,CA2HjC"}
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 type { ListDataStoreContentQueryDto } from '@n8n/api-types';
2
- import { GlobalConfig } from '@n8n/config';
3
- import { DataSource, DataSourceOptions, QueryRunner } from '@n8n/typeorm';
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
- private readonly globalConfig;
10
- constructor(dataSource: DataSource, globalConfig: GlobalConfig);
11
- toTableName(dataStoreId: string): DataStoreUserTableName;
12
- insertRows<T extends boolean | undefined>(dataStoreId: string, rows: DataStoreRows, columns: DataTableColumn[], returnData?: T): Promise<Array<T extends true ? DataStoreRowReturn : Pick<DataStoreRowReturn, 'id'>>>;
13
- updateRow(dataStoreId: string, setData: Record<string, DataStoreColumnJsType | null>, whereData: Record<string, DataStoreColumnJsType | null>, columns: DataTableColumn[], returnData?: boolean): Promise<true | {
14
- [x: string]: DataStoreColumnJsType;
15
- id: number;
16
- createdAt: Date;
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 column = `${(0, sql_utils_1.quoteIdentifier)('dataStore', dbType)}.${(0, sql_utils_1.quoteIdentifier)(filter.columnName, dbType)}`;
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 [`${column} IS NULL`, {}];
26
+ return [`${columnRef} IS NULL`, {}];
26
27
  case 'neq':
27
- return [`${column} IS NOT NULL`, {}];
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 [`${column} ${operators[filter.condition]} :${paramName}`, { [paramName]: value }];
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 [`${column} GLOB :${paramName}`, { [paramName]: globValue }];
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 [`${column} LIKE BINARY :${paramName} ESCAPE '\\\\'`, { [paramName]: escapedValue }];
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 [`${column} LIKE :${paramName} ESCAPE '\\'`, { [paramName]: escapedValue }];
59
+ return [`${columnRef} LIKE :${paramName} ESCAPE '\\'`, { [paramName]: escapedValue }];
56
60
  }
57
- return [`${column} LIKE :${paramName}`, { [paramName]: value }];
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(${column}) LIKE UPPER(:${paramName}) ESCAPE '\\'`,
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(${column}) LIKE UPPER(:${paramName}) ESCAPE '\\\\'`,
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 [`${column} ILIKE :${paramName} ESCAPE '\\'`, { [paramName]: escapedValue }];
79
+ return [`${columnRef} ILIKE :${paramName} ESCAPE '\\'`, { [paramName]: escapedValue }];
76
80
  }
77
- return [`UPPER(${column}) LIKE UPPER(:${paramName})`, { [paramName]: value }];
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, globalConfig) {
86
+ constructor(dataSource) {
83
87
  this.dataSource = dataSource;
84
- this.globalConfig = globalConfig;
85
88
  }
86
- toTableName(dataStoreId) {
87
- const { tablePrefix } = this.globalConfig.database;
88
- return `${tablePrefix}data_table_user_${dataStoreId}`;
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, returnData) {
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 = this.toTableName(dataStoreId);
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 = this.dataSource.createQueryBuilder().insert().into(table).values(completeRow);
137
+ const query = em.createQueryBuilder().insert().into(table).values(completeRow);
107
138
  if (useReturning) {
108
- query.returning(returnData ? selectColumns.join(',') : 'id');
139
+ query.returning(returnType === 'all' ? selectColumns.join(',') : 'id');
109
140
  }
110
141
  const result = await query.execute();
111
142
  if (useReturning) {
112
- const returned = returnData
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 (!returnData) {
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, setData, whereData, columns, returnData = false) {
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 = this.toTableName(dataStoreId);
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
- affectedRows = await this.dataSource
149
- .createQueryBuilder()
150
- .select('id')
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 = this.dataSource.createQueryBuilder().update(table).set(setData).where(whereData);
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 upsertRows(dataStoreId, matchFields, rows, columns, returnData) {
171
- returnData = returnData ?? false;
172
- const { rowsToInsert, rowsToUpdate } = await this.fetchAndSplitRowsByExistence(dataStoreId, matchFields, rows);
173
- const output = [];
174
- if (rowsToInsert.length > 0) {
175
- const result = await this.insertRows(dataStoreId, rowsToInsert, columns, returnData);
176
- if (returnData) {
177
- output.push.apply(output, result);
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
- const table = this.toTableName(dataStoreId);
201
- await this.dataSource
202
- .createQueryBuilder()
203
- .delete()
204
- .from(table, 'dataStore')
205
- .where({ id: (0, typeorm_1.In)(ids) })
206
- .execute();
207
- return true;
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(this.toTableName(dataStoreId), '', queryRunner).withColumns(...dslColumns).withTimestamps;
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(this.toTableName(dataStoreId), true);
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)(this.toTableName(dataStoreId), column, dbType));
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)(this.toTableName(dataStoreId), columnName, dbType));
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
- const [countQuery, query] = this.getManyQuery(dataStoreId, dto, columns);
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 = this.toTableName(dataStoreId);
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 this.dataSource
270
+ const updatedRows = await em
239
271
  .createQueryBuilder()
240
272
  .select(selectColumns)
241
- .from(table, 'dataStore')
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
- async getRowIds(dataStoreId, dto) {
247
- const [_, query] = this.getManyQuery(dataStoreId, dto);
248
- const result = await query.select('dataStore.id').getRawMany();
249
- return result;
250
- }
251
- getManyQuery(dataStoreId, dto, columns) {
252
- const query = this.dataSource.createQueryBuilder();
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, dto, columns) {
261
- const filters = dto.filter?.filters ?? [];
262
- const filterType = dto.filter?.type ?? 'and';
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
- for (const [condition, params] of conditionsAndParams) {
266
- if (filterType === 'or') {
267
- query.orWhere(condition, params);
268
- }
269
- else {
270
- query.andWhere(condition, params);
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)('dataStore', dbType)}.${(0, sql_utils_1.quoteIdentifier)(field, dbType)}`;
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
- query.take(dto.take);
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