mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-20 11:22:15 +00:00
fix(core): Account for retry of execution aborted by pre-execute hook (#9474)
This commit is contained in:
9
packages/cli/src/errors/aborted-execution-retry.error.ts
Normal file
9
packages/cli/src/errors/aborted-execution-retry.error.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { ApplicationError } from 'n8n-workflow';
|
||||
|
||||
export class AbortedExecutionRetryError extends ApplicationError {
|
||||
constructor() {
|
||||
super('The execution was aborted before starting, so it cannot be retried', {
|
||||
level: 'warning',
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -36,6 +36,7 @@ import { NotFoundError } from '@/errors/response-errors/not-found.error';
|
||||
import config from '@/config';
|
||||
import { WaitTracker } from '@/WaitTracker';
|
||||
import type { ExecutionEntity } from '@/databases/entities/ExecutionEntity';
|
||||
import { AbortedExecutionRetryError } from '@/errors/aborted-execution-retry.error';
|
||||
|
||||
export const schemaGetExecutionsQueryFilter = {
|
||||
$id: '/IGetExecutionsQueryFilter',
|
||||
@@ -129,6 +130,8 @@ export class ExecutionService {
|
||||
throw new NotFoundError(`The execution with the ID "${executionId}" does not exist.`);
|
||||
}
|
||||
|
||||
if (!execution.data.executionData) throw new AbortedExecutionRetryError();
|
||||
|
||||
if (execution.finished) {
|
||||
throw new ApplicationError('The execution succeeded, so it cannot be retried.');
|
||||
}
|
||||
|
||||
30
packages/cli/test/unit/services/execution.service.test.ts
Normal file
30
packages/cli/test/unit/services/execution.service.test.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import type { IExecutionResponse } from '@/Interfaces';
|
||||
import type { ExecutionRepository } from '@/databases/repositories/execution.repository';
|
||||
import { AbortedExecutionRetryError } from '@/errors/aborted-execution-retry.error';
|
||||
import { ExecutionService } from '@/executions/execution.service';
|
||||
import type { ExecutionRequest } from '@/executions/execution.types';
|
||||
import { mock } from 'jest-mock-extended';
|
||||
|
||||
describe('ExecutionService', () => {
|
||||
const executionRepository = mock<ExecutionRepository>();
|
||||
const executionService = new ExecutionService(
|
||||
mock(),
|
||||
mock(),
|
||||
mock(),
|
||||
executionRepository,
|
||||
mock(),
|
||||
mock(),
|
||||
mock(),
|
||||
mock(),
|
||||
);
|
||||
|
||||
it('should error on retrying an aborted execution', async () => {
|
||||
const abortedExecutionData = mock<IExecutionResponse>({ data: { executionData: undefined } });
|
||||
executionRepository.findWithUnflattenedData.mockResolvedValue(abortedExecutionData);
|
||||
const req = mock<ExecutionRequest.Retry>();
|
||||
|
||||
const retry = executionService.retry(req, []);
|
||||
|
||||
await expect(retry).rejects.toThrow(AbortedExecutionRetryError);
|
||||
});
|
||||
});
|
||||
@@ -1218,7 +1218,7 @@
|
||||
"nodeView.runButtonText.executeWorkflow": "Test workflow",
|
||||
"nodeView.runButtonText.executingWorkflow": "Executing workflow",
|
||||
"nodeView.runButtonText.waitingForTriggerEvent": "Waiting for trigger event",
|
||||
"nodeView.showError.workflowError": "Workflow execution finished with an error",
|
||||
"nodeView.showError.workflowError": "Workflow execution had an error",
|
||||
"nodeView.showError.getWorkflowDataFromUrl.title": "Problem loading workflow",
|
||||
"nodeView.showError.importWorkflowData.title": "Problem importing workflow",
|
||||
"nodeView.showError.mounted1.message": "There was a problem loading init data",
|
||||
|
||||
Reference in New Issue
Block a user