diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index 97a41988ec4a4..07b4ce98fe491 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -13,7 +13,13 @@ import type { INodeTypes, IRun, } from 'n8n-workflow'; -import { Workflow, NodeOperationError, sleep, ApplicationError } from 'n8n-workflow'; +import { + Workflow, + NodeOperationError, + sleep, + ApplicationError, + ErrorReporterProxy as EventReporter, +} from 'n8n-workflow'; import * as Db from '@/Db'; import * as ResponseHelper from '@/ResponseHelper'; @@ -130,7 +136,15 @@ export class Worker extends BaseCommand { { extra: { executionId } }, ); } - const workflowId = fullExecutionData.workflowData.id!; + const workflowId = fullExecutionData.workflowData.id!; // @tech_debt Ensure this is not optional + + if (!workflowId) { + EventReporter.report('Detected ID-less workflow', { + level: 'info', + extra: { execution: fullExecutionData }, + }); + } + this.logger.info( `Start job: ${job.id} (Workflow ID: ${workflowId} | Execution: ${executionId})`, ); diff --git a/packages/cli/src/databases/repositories/execution.repository.ts b/packages/cli/src/databases/repositories/execution.repository.ts index 7598ff788f922..093430326763d 100644 --- a/packages/cli/src/databases/repositories/execution.repository.ts +++ b/packages/cli/src/databases/repositories/execution.repository.ts @@ -220,7 +220,7 @@ export class ExecutionRepository extends Repository { const { connections, nodes, name } = workflowData ?? {}; await this.executionDataRepository.insert({ executionId, - workflowData: { connections, nodes, name }, + workflowData: { connections, nodes, name, id: workflowData?.id }, data: stringify(data), }); return String(executionId); diff --git a/packages/cli/test/integration/database/repositories/execution.repository.test.ts b/packages/cli/test/integration/database/repositories/execution.repository.test.ts index d16645367f66b..62cb57d2b8ac5 100644 --- a/packages/cli/test/integration/database/repositories/execution.repository.test.ts +++ b/packages/cli/test/integration/database/repositories/execution.repository.test.ts @@ -43,6 +43,7 @@ describe('ExecutionRepository', () => { const executionDataRepo = Container.get(ExecutionDataRepository); const executionData = await executionDataRepo.findOneBy({ executionId }); expect(executionData?.workflowData).toEqual({ + id: workflow.id, connections: workflow.connections, nodes: workflow.nodes, name: workflow.name, diff --git a/packages/workflow/src/Workflow.ts b/packages/workflow/src/Workflow.ts index 6ec06db20cadd..f09256d8ca1be 100644 --- a/packages/workflow/src/Workflow.ts +++ b/packages/workflow/src/Workflow.ts @@ -52,6 +52,7 @@ import { RoutingNode } from './RoutingNode'; import { Expression } from './Expression'; import { NODES_WITH_RENAMABLE_CONTENT } from './Constants'; import { ApplicationError } from './errors/application.error'; +import * as EventReporter from './ErrorReporterProxy'; function dedupe(arr: T[]): T[] { return [...new Set(arr)]; @@ -94,7 +95,14 @@ export class Workflow { settings?: IWorkflowSettings; pinData?: IPinData; }) { - this.id = parameters.id as string; + if (!parameters.id) { + EventReporter.report('Detected ID-less workflow', { + level: 'info', + extra: { parameters }, + }); + } + + this.id = parameters.id as string; // @tech_debt Ensure this is not optional this.name = parameters.name; this.nodeTypes = parameters.nodeTypes; this.pinData = parameters.pinData;