From 4e6a4031abeb5c7603e9a63021a40c622ef77c2f Mon Sep 17 00:00:00 2001 From: MariusVuscanNx <96233009+MariusVuscanNx@users.noreply.github.com> Date: Wed, 8 Mar 2023 15:36:26 +0200 Subject: [PATCH] Workflow fault should be handled after execution (#3778) --- .../Elsa.Http/Middleware/WorkflowsMiddleware.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/modules/Elsa.Http/Middleware/WorkflowsMiddleware.cs b/src/modules/Elsa.Http/Middleware/WorkflowsMiddleware.cs index 23393f3df..31f07b53b 100644 --- a/src/modules/Elsa.Http/Middleware/WorkflowsMiddleware.cs +++ b/src/modules/Elsa.Http/Middleware/WorkflowsMiddleware.cs @@ -115,14 +115,14 @@ public class WorkflowsMiddleware if (await HandleMultipleWorkflowsFoundAsync(httpContext, workflowMatches, cancellationToken)) return; - if (await HandleWorkflowFaultAsync(httpContext, workflowMatches.Single(), cancellationToken)) - return; - if (await AuthorizeAsync(httpContext, workflowMatches.Single(), bookmarkPayload, cancellationToken)) return; var executionResult = await _workflowRuntime.ExecuteWorkflowAsync(workflowMatches.Single(), input, cancellationToken); + if (await HandleWorkflowFaultAsync(httpContext, executionResult, cancellationToken)) + return; + // Process the trigger result by resuming each HTTP bookmark, if any. await _httpBookmarkProcessor.ProcessBookmarks(new List { executionResult }, correlationId, input, cancellationToken); } @@ -199,9 +199,9 @@ public class WorkflowsMiddleware return true; } - private async Task HandleWorkflowFaultAsync(HttpContext httpContext, WorkflowMatch workflowMatch, CancellationToken cancellationToken) + private async Task HandleWorkflowFaultAsync(HttpContext httpContext, WorkflowExecutionResult workflowExecutionResult, CancellationToken cancellationToken) { - var instanceFilter = new WorkflowInstanceFilter { Id = workflowMatch.WorkflowInstanceId }; + var instanceFilter = new WorkflowInstanceFilter { Id = workflowExecutionResult.InstanceId }; var workflowInstance = await _workflowInstanceStore.FindAsync(instanceFilter, cancellationToken); if (workflowInstance is not null @@ -222,19 +222,19 @@ public class WorkflowsMiddleware CancellationToken cancellationToken) { var payload = await GetBookmarkPayloadAsync(pendingWorkflowMatch, bookmarkPayload, cancellationToken); - + if (!(payload.Authorize ?? false)) return false; var authorized = await _httpEndpointAuthorizationHandler.AuthorizeAsync(new AuthorizeHttpEndpointContext(httpContext, pendingWorkflowMatch.WorkflowInstanceId, payload.Policy)); - if (!authorized) + if (!authorized) httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; return !authorized; } - private async Task GetBookmarkPayloadAsync(WorkflowMatch workflowMatch,HttpEndpointBookmarkPayload bookmarkPayload, CancellationToken cancellationToken) + private async Task GetBookmarkPayloadAsync(WorkflowMatch workflowMatch, HttpEndpointBookmarkPayload bookmarkPayload, CancellationToken cancellationToken) { var hash = _hasher.Hash(_activityTypeName, bookmarkPayload);