< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Execute.WorkflowExecutionHelper
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Execute/WorkflowExecutionHelper.cs
Line coverage
62%
Covered lines: 33
Uncovered lines: 20
Coverable lines: 53
Total lines: 111
Line coverage: 62.2%
Branch coverage
59%
Covered branches: 13
Total branches: 22
Branch coverage: 59%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ExecuteWorkflowAsync()72.22%211878.57%
HandleFaultAsync()100%210%
SendScriptAuthorizationFailureAsync()0%2040%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Execute/WorkflowExecutionHelper.cs

#LineLine coverage
 1using System.Net.Mime;
 2using Elsa.Common.Models;
 3using Elsa.Workflows.Api.Security;
 4using Elsa.Workflows.Management;
 5using Elsa.Workflows.Runtime;
 6using Elsa.Workflows.State;
 7using FastEndpoints;
 8using Microsoft.AspNetCore.Http;
 9
 10namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Execute;
 11
 12internal static class WorkflowExecutionHelper
 13{
 14    public static async Task ExecuteWorkflowAsync(
 15        IExecutionRequest request,
 16        IWorkflowDefinitionService workflowDefinitionService,
 17        IWorkflowRuntime workflowRuntime,
 18        IWorkflowStarter workflowStarter,
 19        IApiSerializer apiSerializer,
 20        WorkflowDefinitionScriptAuthorizationService scriptAuthorizationService,
 21        HttpContext httpContext,
 22        CancellationToken cancellationToken)
 23    {
 1124        var definitionId = request.DefinitionId;
 1125        var versionOptions = request.VersionOptions ?? VersionOptions.Published;
 1126        var workflowGraph = await workflowDefinitionService.FindWorkflowGraphAsync(definitionId, versionOptions, cancell
 27
 1128        if (workflowGraph == null)
 29        {
 030            await httpContext.Response.SendNotFoundAsync(cancellation: cancellationToken);
 031            return;
 32        }
 33
 1134        var scriptAuthorizationResult = await scriptAuthorizationService.AuthorizeAsync(workflowGraph.Workflow, httpCont
 1135        if (!scriptAuthorizationResult.Succeeded)
 36        {
 037            await SendScriptAuthorizationFailureAsync(httpContext, scriptAuthorizationResult, cancellationToken);
 038            return;
 39        }
 40
 1141        var startRequest = new StartWorkflowRequest
 1142        {
 1143            Workflow = workflowGraph.Workflow,
 1144            CorrelationId = request.CorrelationId,
 1145            Name = request.Name,
 1146            Input = request.GetInputAsDictionary(),
 1147            Variables = request.GetVariablesAsDictionary(),
 1148            TriggerActivityId = request.TriggerActivityId,
 1149            ActivityHandle = request.ActivityHandle
 1150        };
 51
 1152        var startResponse = await workflowStarter.StartWorkflowAsync(startRequest, cancellationToken);
 53
 1154        if(!httpContext.Response.HasStarted)
 1155            httpContext.Response.Headers.Append("x-elsa-workflow-cannot-start", startResponse.CannotStart.ToString());
 56
 1157        if (startResponse.CannotStart)
 58        {
 059            httpContext.Response.StatusCode = StatusCodes.Status200OK;
 060            await httpContext.Response.SendOkAsync(cancellationToken);
 061            return;
 62        }
 63
 1164        var instanceId = startResponse.WorkflowInstanceId!;
 65
 1166        if(!httpContext.Response.HasStarted)
 1167            httpContext.Response.Headers.Append("x-elsa-workflow-instance-id", instanceId);
 68
 1169        var workflowClient = await workflowRuntime.CreateClientAsync(instanceId, cancellationToken);
 70
 1171        if (startResponse.SubStatus == WorkflowSubStatus.Faulted)
 72        {
 073            var workflowState = await workflowClient.ExportStateAsync(cancellationToken);
 074            await HandleFaultAsync(workflowState, apiSerializer, httpContext, cancellationToken);
 75        }
 76        else
 77        {
 1178            if (!httpContext.Response.HasStarted)
 79            {
 1180                httpContext.Response.Headers.Append("x-elsa-response", "true");
 1181                if (httpContext.Response.StatusCode == StatusCodes.Status200OK)
 82                {
 1183                    var workflowState = await workflowClient.ExportStateAsync(cancellationToken);
 1184                    var response = apiSerializer.Serialize(new Response(workflowState));
 1185                    httpContext.Response.ContentType = MediaTypeNames.Application.Json;
 1186                    await httpContext.Response.WriteAsync(response, cancellationToken);
 87                }
 88            }
 89        }
 1190    }
 91
 92    private static async Task HandleFaultAsync(WorkflowState workflowState, IApiSerializer apiSerializer, HttpContext ht
 93    {
 094        var faultedResponse = apiSerializer.Serialize(new Response(workflowState));
 095        httpContext.Response.ContentType = MediaTypeNames.Application.Json;
 096        httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
 097        await httpContext.Response.WriteAsync(faultedResponse, cancellationToken);
 098    }
 99
 100    private static async Task SendScriptAuthorizationFailureAsync(HttpContext httpContext, WorkflowDefinitionScriptAutho
 101    {
 0102        if (result.FailureReason == WorkflowDefinitionScriptAuthorizationFailureReason.MissingPermission)
 103        {
 0104            await httpContext.Response.SendForbiddenAsync(cancellation: cancellationToken);
 0105            return;
 106        }
 107
 0108        httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
 0109        await httpContext.Response.WriteAsync(result.Message ?? "Workflow script authorization failed.", cancellationTok
 0110    }
 111}