< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Dispatch.Endpoint
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Dispatch/Endpoint.cs
Line coverage
18%
Covered lines: 8
Uncovered lines: 35
Coverable lines: 43
Total lines: 79
Line coverage: 18.6%
Branch coverage
0%
Covered branches: 0
Total branches: 14
Branch coverage: 0%
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()0%210140%

File(s)

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

#LineLine coverage
 1using Elsa.Abstractions;
 2using Elsa.Common.Models;
 3using Elsa.Workflows.Api.Security;
 4using Elsa.Workflows.Management;
 5using Elsa.Workflows.Runtime;
 6using Elsa.Workflows.Runtime.Requests;
 7using JetBrains.Annotations;
 8
 9namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Dispatch;
 10
 11[UsedImplicitly]
 312internal class Endpoint(
 313    IWorkflowDefinitionService workflowDefinitionService,
 314    IWorkflowDispatcher workflowDispatcher,
 315    IIdentityGenerator identityGenerator,
 316    WorkflowDefinitionScriptAuthorizationService scriptAuthorizationService) : ElsaEndpoint<Request, Response>
 17{
 18    public override void Configure()
 19    {
 320        Post("/workflow-definitions/{definitionId}/dispatch");
 321        ConfigurePermissions("exec:workflow-definitions");
 322    }
 23
 24    public override async Task HandleAsync(Request request, CancellationToken cancellationToken)
 25    {
 026        var definitionId = request.DefinitionId;
 027        var versionOptions = request.VersionOptions ?? VersionOptions.Published;
 028        var workflowGraph = await workflowDefinitionService.FindWorkflowGraphAsync(definitionId, versionOptions, cancell
 29
 030        if(workflowGraph == null)
 31        {
 032            await Send.NotFoundAsync(cancellationToken);
 033            return;
 34        }
 35
 036        var scriptAuthorizationResult = await scriptAuthorizationService.AuthorizeAsync(workflowGraph.Workflow, User, ca
 037        if (!scriptAuthorizationResult.Succeeded)
 38        {
 039            await WorkflowDefinitionScriptAuthorizationFailure.SendAsync(scriptAuthorizationResult, Send.ForbiddenAsync,
 040            return;
 41        }
 42
 043        var input = request.Input;
 44
 045        if(input != null && input is not IDictionary<string, object>)
 46        {
 047            AddError("Input must be a dictionary.");
 048            await Send.ErrorsAsync(cancellation: cancellationToken);
 049            return;
 50        }
 51
 052        var instanceId = request.InstanceId ?? identityGenerator.GenerateId();
 053        var dispatchRequest = new DispatchWorkflowDefinitionRequest(workflowGraph.Workflow.Identity.Id)
 054        {
 055            Input = input as IDictionary<string, object>,
 056            InstanceId = instanceId,
 057            CorrelationId = request.CorrelationId,
 058            TriggerActivityId = request.TriggerActivityId,
 059        };
 60
 061        var options = new DispatchWorkflowOptions
 062        {
 063            Channel = request.Channel
 064        };
 65
 066        var result = await workflowDispatcher.DispatchAsync(dispatchRequest, options, cancellationToken);
 67
 068        if(!result.Succeeded)
 69        {
 070            var fault = result.Fault!;
 071            AddError(fault.Message, fault.Code);
 072            await Send.ErrorsAsync(cancellation: cancellationToken);
 073            return;
 74        }
 75
 076        await Send.OkAsync(new Response(instanceId), cancellationToken);
 077    }
 78
 79}