< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Execute.PostEndpoint
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Execute/PostEndpoint.cs
Line coverage
85%
Covered lines: 36
Uncovered lines: 6
Coverable lines: 42
Total lines: 81
Line coverage: 85.7%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Configure()100%11100%
HandleAsync()83.33%131281.25%

File(s)

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

#LineLine coverage
 1using Elsa.Authorization;
 2using System.Text.Json;
 3using Elsa.Abstractions;
 4using Elsa.Workflows.Api.Security;
 5using Elsa.Workflows.Management;
 6using Elsa.Workflows.Runtime;
 7using JetBrains.Annotations;
 8
 9namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Execute;
 10
 11/// <summary>
 12/// An API endpoint that executes a given workflow definition through POST method.
 13/// </summary>
 14[PublicAPI]
 1515internal class PostEndpoint(
 1516    IWorkflowDefinitionService workflowDefinitionService,
 1517    IWorkflowRuntime workflowRuntime,
 1518    IWorkflowStarter workflowStarter,
 1519    IApiSerializer apiSerializer,
 1520    WorkflowDefinitionScriptAuthorizationService scriptAuthorizationService)
 21    : ElsaEndpointWithoutRequest<Response>
 22{
 23    /// <inheritdoc />
 24    public override void Configure()
 25    {
 326        Routes("/workflow-definitions/{definitionId}/execute");
 327        RequirePermission(Elsa.Workflows.Api.Permissions.WorkflowPermissions.Definitions, CoreVerbs.Execute);
 328        Verbs(FastEndpoints.Http.POST);
 329    }
 30    /// <inheritdoc />
 31    public override async Task HandleAsync(CancellationToken cancellationToken)
 32    {
 1233        PostRequest? request = null;
 34
 1235        if (HttpContext.Request.ContentType?.Contains("application/json") ?? false)
 36        {
 1137            using var reader = new StreamReader(HttpContext.Request.Body);
 1138            var body = await reader.ReadToEndAsync(cancellationToken);
 39
 1140            if (!string.IsNullOrWhiteSpace(body))
 41            {
 42                try
 43                {
 1044                    request = JsonSerializer.Deserialize<PostRequest>(body, new JsonSerializerOptions
 1045                    {
 1046                        PropertyNameCaseInsensitive = true
 1047                    });
 1048                }
 049                catch
 50                {
 051                    AddError("Invalid request body.");
 052                }
 53            }
 1154        }
 55
 1256        request ??= new();
 57
 1258        var definitionId = Route<string>("definitionId");
 59
 1260        if (string.IsNullOrWhiteSpace(definitionId))
 061            AddError("Missing workflow definition ID.");
 62        else
 1263            request.DefinitionId = definitionId;
 64
 1265        if (ValidationFailed)
 66        {
 067            await Send.ErrorsAsync(cancellation: cancellationToken);
 068            return;
 69        }
 70
 1271        await WorkflowExecutionHelper.ExecuteWorkflowAsync(
 1272            request,
 1273            workflowDefinitionService,
 1274            workflowRuntime,
 1275            workflowStarter,
 1276            apiSerializer,
 1277            scriptAuthorizationService,
 1278            HttpContext,
 1279            cancellationToken);
 1280    }
 81}