< Summary

Information
Class: Elsa.Workflows.Runtime.Handlers.ResumeBulkDispatchWorkflowActivity
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Handlers/ResumeBulkDispatchWorkflowActivity.cs
Line coverage
98%
Covered lines: 50
Uncovered lines: 1
Coverable lines: 51
Total lines: 84
Line coverage: 98%
Branch coverage
90%
Covered branches: 9
Total branches: 10
Branch coverage: 90%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.cctor()100%11100%
HandleAsync()87.5%8896.96%
HandleAsync()100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Handlers/ResumeBulkDispatchWorkflowActivity.cs

#LineLine coverage
 1using Elsa.Mediator.Contracts;
 2using Elsa.Workflows;
 3using Elsa.Workflows.Helpers;
 4using Elsa.Workflows.Notifications;
 5using Elsa.Workflows.Runtime.Activities;
 6using Elsa.Workflows.Runtime.Notifications;
 7using Elsa.Workflows.Runtime.Options;
 8using Elsa.Workflows.Runtime.Stimuli;
 9using JetBrains.Annotations;
 10
 11namespace Elsa.Workflows.Runtime.Handlers;
 12
 13/// <summary>
 14/// Resumes any blocking <see cref="BulkDispatchWorkflows"/> activities when its child workflows complete.
 15/// </summary>
 16[PublicAPI]
 73417internal class ResumeBulkDispatchWorkflowActivity(IBookmarkQueue bookmarkQueue, IStimulusHasher stimulusHasher, IStimulu
 18    INotificationHandler<WorkflowExecuted>,
 19    INotificationHandler<DispatchWorkflowActivationDenied>
 20{
 321    private static readonly string ActivityTypeName = ActivityTypeNameHelper.GenerateTypeName<BulkDispatchWorkflows>();
 22
 23    public async Task HandleAsync(WorkflowExecuted notification, CancellationToken cancellationToken)
 24    {
 60525        var workflowState = notification.WorkflowState;
 26
 60527        if (workflowState.Status != WorkflowStatus.Finished)
 9628            return;
 29
 50930        var waitForCompletion = workflowState.Properties.TryGetValue("WaitForCompletion", out var waitForCompletionValue
 31
 50932        if (!waitForCompletion)
 49033            return;
 34
 1935        if (!workflowState.Properties.TryGetValue("ParentInstanceId", out var parentInstanceIdValue))
 036            return;
 37
 1938        var parentInstanceId = (string)parentInstanceIdValue;
 1939        var activityTypeName = ActivityTypeName;
 1940        var stimulus = new BulkDispatchWorkflowsStimulus(parentInstanceId);
 1941        var stimulusHash = stimulusHasher.Hash(activityTypeName, stimulus);
 1942        var workflowInstanceId = workflowState.Id;
 1943        var input = new Dictionary<string, object>
 1944        {
 1945            ["WorkflowOutput"] = workflowState.Output,
 1946            ["WorkflowInstanceId"] = workflowInstanceId,
 1947            ["WorkflowStatus"] = workflowState.Status,
 1948            ["WorkflowSubStatus"] = workflowState.SubStatus,
 1949        };
 50
 1951        var resumeBookmarkOptions = new ResumeBookmarkOptions
 1952        {
 1953            Input = input
 1954        };
 1955        var bookmarkQueueItem = new NewBookmarkQueueItem
 1956        {
 1957            WorkflowInstanceId = parentInstanceId,
 1958            ActivityTypeName = activityTypeName,
 1959            StimulusHash = stimulusHash,
 1960            Options = resumeBookmarkOptions
 1961        };
 1962        await bookmarkQueue.EnqueueAsync(bookmarkQueueItem, cancellationToken);
 60563    }
 64
 65    public async Task HandleAsync(DispatchWorkflowActivationDenied notification, CancellationToken cancellationToken)
 66    {
 467        if (notification.ActivityTypeName != ActivityTypeName)
 268            return;
 69
 270        var input = new Dictionary<string, object>
 271        {
 272            ["CannotStart"] = true,
 273            ["WorkflowOutput"] = new Dictionary<string, object>(),
 274            ["WorkflowInstanceId"] = notification.WorkflowInstanceId,
 275            ["WorkflowStatus"] = WorkflowStatus.Finished,
 276            ["WorkflowSubStatus"] = WorkflowSubStatus.Faulted
 277        };
 278        await stimulusSender.SendAsync(notification.StimulusHash, new()
 279        {
 280            WorkflowInstanceId = notification.ParentWorkflowInstanceId,
 281            Input = input
 282        }, cancellationToken);
 483    }
 84}