From 140e1b082e9fd4d7749dda5a926b4aab0ff26665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Fri, 29 Aug 2025 14:33:03 +0200 Subject: [PATCH] refactor(core): Decouple datastore from workflow execution context (#18963) --- .../modules/data-table/data-store-column.repository.ts | 1 + .../cli/src/modules/data-table/data-store.repository.ts | 1 + packages/cli/src/modules/data-table/data-table.module.ts | 9 +++++++-- packages/cli/src/workflow-execute-additional-data.ts | 8 -------- packages/core/src/execution-engine/index.ts | 2 +- .../utils/data-store-helper-functions.ts | 4 ++-- 6 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/cli/src/modules/data-table/data-store-column.repository.ts b/packages/cli/src/modules/data-table/data-store-column.repository.ts index 65dd4488b3..541d423b23 100644 --- a/packages/cli/src/modules/data-table/data-store-column.repository.ts +++ b/packages/cli/src/modules/data-table/data-store-column.repository.ts @@ -60,6 +60,7 @@ export class DataStoreColumnRepository extends Repository { dataTableId, }); + // @ts-ignore Workaround for intermittent typecheck issue with _QueryDeepPartialEntity await em.insert(DataTableColumn, column); const queryRunner = em.queryRunner; diff --git a/packages/cli/src/modules/data-table/data-store.repository.ts b/packages/cli/src/modules/data-table/data-store.repository.ts index e7d2446f1d..cd73cd3ff7 100644 --- a/packages/cli/src/modules/data-table/data-store.repository.ts +++ b/packages/cli/src/modules/data-table/data-store.repository.ts @@ -28,6 +28,7 @@ export class DataStoreRepository extends Repository { let dataTableId: string | undefined; await this.manager.transaction(async (em) => { const dataStore = em.create(DataTable, { name, columns, projectId }); + // @ts-ignore Workaround for intermittent typecheck issue with _QueryDeepPartialEntity await em.insert(DataTable, dataStore); dataTableId = dataStore.id; diff --git a/packages/cli/src/modules/data-table/data-table.module.ts b/packages/cli/src/modules/data-table/data-table.module.ts index e96ac649bd..db2dc0b05c 100644 --- a/packages/cli/src/modules/data-table/data-table.module.ts +++ b/packages/cli/src/modules/data-table/data-table.module.ts @@ -2,7 +2,6 @@ import { Logger } from '@n8n/backend-common'; import type { ModuleInterface } from '@n8n/decorators'; import { BackendModule, OnShutdown } from '@n8n/decorators'; import { Container } from '@n8n/di'; -import { BaseEntity } from '@n8n/typeorm'; const YELLOW = '\x1b[33m'; const CLEAR = '\x1b[0m'; @@ -38,6 +37,12 @@ export class DataStoreModule implements ModuleInterface { const { DataTable } = await import('./data-table.entity'); const { DataTableColumn } = await import('./data-table-column.entity'); - return [DataTable, DataTableColumn] as unknown as Array BaseEntity>; + return [DataTable, DataTableColumn]; + } + + async context() { + const { DataStoreProxyService } = await import('./data-store-proxy.service'); + + return { dataStoreProxyProvider: Container.get(DataStoreProxyService) }; } } diff --git a/packages/cli/src/workflow-execute-additional-data.ts b/packages/cli/src/workflow-execute-additional-data.ts index 7c27f0eee1..0c4f126595 100644 --- a/packages/cli/src/workflow-execute-additional-data.ts +++ b/packages/cli/src/workflow-execute-additional-data.ts @@ -377,15 +377,7 @@ export async function getBase( const eventService = Container.get(EventService); - const moduleRegistry = Container.get(ModuleRegistry); - const dataStoreProxyProvider = moduleRegistry.isActive('data-table') - ? Container.get( - (await import('@/modules/data-table/data-store-proxy.service')).DataStoreProxyService, - ) - : undefined; - const additionalData: IWorkflowExecuteAdditionalData = { - dataStoreProxyProvider, currentNodeExecutionIndex: 0, credentialsHelper: Container.get(CredentialsHelper), executeWorkflow, diff --git a/packages/core/src/execution-engine/index.ts b/packages/core/src/execution-engine/index.ts index ed82afbac5..3285980d7d 100644 --- a/packages/core/src/execution-engine/index.ts +++ b/packages/core/src/execution-engine/index.ts @@ -7,7 +7,7 @@ declare module 'n8n-workflow' { interface IWorkflowExecuteAdditionalData { hooks?: ExecutionLifecycleHooks; externalSecretsProxy: ExternalSecretsProxy; - dataStoreProxyProvider?: DataStoreProxyProvider; + 'data-table'?: { dataStoreProxyProvider: DataStoreProxyProvider }; dataStoreProjectId?: string; } } diff --git a/packages/core/src/execution-engine/node-execution-context/utils/data-store-helper-functions.ts b/packages/core/src/execution-engine/node-execution-context/utils/data-store-helper-functions.ts index fc8e027b18..4c7d57d808 100644 --- a/packages/core/src/execution-engine/node-execution-context/utils/data-store-helper-functions.ts +++ b/packages/core/src/execution-engine/node-execution-context/utils/data-store-helper-functions.ts @@ -10,8 +10,8 @@ export function getDataStoreHelperFunctions( workflow: Workflow, node: INode, ): Partial { - if (additionalData.dataStoreProxyProvider === undefined) return {}; - const dataStoreProxyProvider = additionalData.dataStoreProxyProvider; + const dataStoreProxyProvider = additionalData['data-table']?.dataStoreProxyProvider; + if (!dataStoreProxyProvider) return {}; return { getDataStoreAggregateProxy: async () => await dataStoreProxyProvider.getDataStoreAggregateProxy(