< Summary

Information
Class: Elsa.Workflows.Runtime.ObsoleteWorkflowRuntime
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/ObsoleteWorkflowRuntime.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 169
Coverable lines: 169
Total lines: 260
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 84
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/ObsoleteWorkflowRuntime.cs

#LineLine coverage
 1
 2using Elsa.Common.Models;
 3using Elsa.Workflows.Management;
 4using Elsa.Workflows.Management.Filters;
 5using Elsa.Workflows.Models;
 6using Elsa.Workflows.Runtime.Entities;
 7using Elsa.Workflows.Runtime.Filters;
 8using Elsa.Workflows.Runtime.Matches;
 9using Elsa.Workflows.Runtime.Messages;
 10using Elsa.Workflows.Runtime.Options;
 11using Elsa.Workflows.Runtime.Parameters;
 12using Elsa.Workflows.Runtime.Params;
 13using Elsa.Workflows.Runtime.Requests;
 14using Elsa.Workflows.Runtime.Results;
 15using Elsa.Workflows.State;
 16using Microsoft.Extensions.DependencyInjection;
 17using Open.Linq.AsyncExtensions;
 18
 19namespace Elsa.Workflows.Runtime;
 20
 21/// <summary>
 22/// Implements the now deprecated workflow runtime API methods.
 23/// </summary>
 024public class ObsoleteWorkflowRuntime(
 025    Func<string?, CancellationToken, ValueTask<IWorkflowClient>> createClientAsync,
 026    IWorkflowDefinitionService workflowDefinitionService,
 027    IWorkflowActivationStrategyEvaluator workflowActivationStrategyEvaluator,
 028    IStimulusSender stimulusSender,
 029    IStimulusHasher stimulusHasher,
 030    IBookmarkStore bookmarkStore,
 031    IWorkflowInstanceStore workflowInstanceStore,
 032    ITriggerBoundWorkflowService triggerBoundWorkflowService,
 033    IBookmarkBoundWorkflowService bookmarkBoundWorkflowService)
 34{
 35    public static ObsoleteWorkflowRuntime Create(IServiceProvider serviceProvider, Func<string?, CancellationToken, Valu
 36    {
 037        return ActivatorUtilities.CreateInstance<ObsoleteWorkflowRuntime>(serviceProvider, createClientAsync);
 38    }
 39
 40    public async Task<CanStartWorkflowResult> CanStartWorkflowAsync(string definitionId, StartWorkflowRuntimeParams? opt
 41    {
 042        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 043        var workflowGraph = await workflowDefinitionService.FindWorkflowGraphAsync(definitionId, options?.VersionOptions
 044        var workflow = workflowGraph!.Workflow;
 45
 046        var canStart = await workflowActivationStrategyEvaluator.CanStartWorkflowAsync(new()
 047        {
 048            Workflow = workflow,
 049            CorrelationId = options?.CorrelationId,
 050            CancellationToken = cancellationToken
 051        });
 52
 053        return new(null, canStart);
 054    }
 55
 56    public async Task<WorkflowExecutionResult> StartWorkflowAsync(string definitionId, StartWorkflowRuntimeParams? optio
 57    {
 058        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 059        var client = await createClientAsync(options?.InstanceId, cancellationToken);
 060        var createRequest = new CreateAndRunWorkflowInstanceRequest
 061        {
 062            Properties = options?.Properties,
 063            CorrelationId = options?.CorrelationId,
 064            Input = options?.Input,
 065            WorkflowDefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definitionId, options?.VersionOptions ?? 
 066            ParentId = options?.ParentWorkflowInstanceId,
 067            TriggerActivityId = options?.TriggerActivityId
 068        };
 069        var response = await client.CreateAndRunInstanceAsync(createRequest, cancellationToken);
 070        if (response.CannotStart)
 071            throw new InvalidOperationException("The workflow activation strategy refused to create a new workflow insta
 72
 073        return new(response.WorkflowInstanceId, response.Status, response.SubStatus, response.Bookmarks, response.Incide
 074    }
 75
 76    public async Task<ICollection<WorkflowExecutionResult>> StartWorkflowsAsync(string activityTypeName, object bookmark
 77    {
 078        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 079        var metadata = new StimulusMetadata
 080        {
 081            CorrelationId = options?.CorrelationId,
 082            WorkflowInstanceId = options?.WorkflowInstanceId,
 083            Properties = options?.Properties,
 084            ActivityInstanceId = options?.ActivityInstanceId,
 085            Input = options?.Input
 086        };
 087        var result = await stimulusSender.SendAsync(activityTypeName, bookmarkPayload, metadata, cancellationToken);
 088        var results = result.WorkflowInstanceResponses.Select(x => new WorkflowExecutionResult(x.WorkflowInstanceId, x.S
 089        return results;
 090    }
 91
 92    public async Task<WorkflowExecutionResult?> TryStartWorkflowAsync(string definitionId, StartWorkflowRuntimeParams? o
 93    {
 094        return await StartWorkflowAsync(definitionId, options);
 095    }
 96
 97    public async Task<WorkflowExecutionResult?> ResumeWorkflowAsync(string workflowInstanceId, ResumeWorkflowRuntimePara
 98    {
 099        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 0100        var workflowClient = await createClientAsync(workflowInstanceId, cancellationToken);
 0101        var exists = await workflowClient.InstanceExistsAsync(cancellationToken);
 102
 0103        if (!exists)
 0104            return null;
 105
 0106        var runWorkflowRequest = new RunWorkflowInstanceRequest
 0107        {
 0108            Input = options?.Input,
 0109            Properties = options?.Properties,
 0110            ActivityHandle = options?.ActivityHandle,
 0111            BookmarkId = options?.BookmarkId
 0112        };
 113
 0114        var response = await workflowClient.RunInstanceAsync(runWorkflowRequest, cancellationToken);
 115
 0116        return new(response.WorkflowInstanceId, response.Status, response.SubStatus, response.Bookmarks, response.Incide
 0117    }
 118
 119    public async Task<ICollection<WorkflowExecutionResult>> ResumeWorkflowsAsync(string activityTypeName, object bookmar
 120    {
 0121        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 0122        var metadata = new StimulusMetadata
 0123        {
 0124            CorrelationId = options?.CorrelationId,
 0125            WorkflowInstanceId = options?.WorkflowInstanceId,
 0126            Properties = options?.Properties,
 0127            ActivityInstanceId = options?.ActivityInstanceId,
 0128            Input = options?.Input
 0129        };
 0130        var result = await stimulusSender.SendAsync(activityTypeName, bookmarkPayload, metadata, cancellationToken);
 0131        var results = result.WorkflowInstanceResponses.Select(x => new WorkflowExecutionResult(x.WorkflowInstanceId, x.S
 0132        return results;
 0133    }
 134
 135    public async Task<TriggerWorkflowsResult> TriggerWorkflowsAsync(string activityTypeName, object bookmarkPayload, Tri
 136    {
 0137        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 0138        var metadata = new StimulusMetadata
 0139        {
 0140            CorrelationId = options?.CorrelationId,
 0141            WorkflowInstanceId = options?.WorkflowInstanceId,
 0142            Properties = options?.Properties,
 0143            ActivityInstanceId = options?.ActivityInstanceId,
 0144            Input = options?.Input
 0145        };
 0146        var result = await stimulusSender.SendAsync(activityTypeName, bookmarkPayload, metadata, cancellationToken);
 0147        var results = result.WorkflowInstanceResponses.Select(x => new WorkflowExecutionResult(x.WorkflowInstanceId, x.S
 0148        return new(results);
 0149    }
 150
 151    public async Task<WorkflowExecutionResult> ExecuteWorkflowAsync(WorkflowMatch match, ExecuteWorkflowParams? options 
 152    {
 0153        var cancellationToken = options?.CancellationToken ?? CancellationToken.None;
 0154        if (match is StartableWorkflowMatch collectedStartableWorkflow)
 155        {
 0156            var startOptions = new StartWorkflowRuntimeParams
 0157            {
 0158                CorrelationId = collectedStartableWorkflow.CorrelationId,
 0159                Input = options?.Input,
 0160                Properties = options?.Properties,
 0161                VersionOptions = VersionOptions.Published,
 0162                TriggerActivityId = collectedStartableWorkflow.ActivityId,
 0163                CancellationToken = cancellationToken
 0164            };
 165
 0166            var startResult = await StartWorkflowAsync(collectedStartableWorkflow.DefinitionId!, startOptions);
 0167            return startResult with
 0168            {
 0169                TriggeredActivityId = collectedStartableWorkflow.ActivityId
 0170            };
 171        }
 172
 0173        var collectedResumableWorkflow = (match as ResumableWorkflowMatch)!;
 0174        var runtimeOptions = new ResumeWorkflowRuntimeParams
 0175        {
 0176            CorrelationId = collectedResumableWorkflow.CorrelationId,
 0177            BookmarkId = collectedResumableWorkflow.BookmarkId,
 0178            Input = options?.Input,
 0179            Properties = options?.Properties,
 0180            CancellationToken = cancellationToken,
 0181        };
 182
 0183        return (await ResumeWorkflowAsync(collectedResumableWorkflow.WorkflowInstanceId, runtimeOptions))!;
 0184    }
 185
 186    public async Task<CancellationResult> CancelWorkflowAsync(string workflowInstanceId, CancellationToken cancellationT
 187    {
 0188        var client = await createClientAsync(workflowInstanceId, cancellationToken);
 0189        await client.CancelAsync(cancellationToken);
 0190        return new(true);
 0191    }
 192
 193    public async Task<IEnumerable<WorkflowMatch>> FindWorkflowsAsync(WorkflowsFilter filter, CancellationToken cancellat
 194    {
 0195        var startableWorkflows = await FindStartableWorkflowsAsync(filter, cancellationToken);
 0196        var resumableWorkflows = await FindResumableWorkflowsAsync(filter, cancellationToken);
 0197        var results = startableWorkflows.Concat(resumableWorkflows).ToList();
 0198        return results;
 0199    }
 200
 201    public async Task<WorkflowState?> ExportWorkflowStateAsync(string workflowInstanceId, CancellationToken cancellation
 202    {
 0203        var client = await createClientAsync(workflowInstanceId, cancellationToken);
 0204        return await client.ExportStateAsync(cancellationToken);
 0205    }
 206
 207    public async Task ImportWorkflowStateAsync(WorkflowState workflowState, CancellationToken cancellationToken = defaul
 208    {
 0209        var client = await createClientAsync(workflowState.Id, cancellationToken);
 0210        await client.ImportStateAsync(workflowState, cancellationToken);
 0211    }
 212
 213    public async Task UpdateBookmarkAsync(StoredBookmark bookmark, CancellationToken cancellationToken = default)
 214    {
 0215        await bookmarkStore.SaveAsync(bookmark, cancellationToken);
 0216    }
 217
 218    public async Task<long> CountRunningWorkflowsAsync(CountRunningWorkflowsRequest request, CancellationToken cancellat
 219    {
 0220        var filter = new WorkflowInstanceFilter
 0221        {
 0222            DefinitionId = request.DefinitionId,
 0223            Version = request.Version,
 0224            CorrelationId = request.CorrelationId,
 0225            WorkflowStatus = WorkflowStatus.Running
 0226        };
 0227        return await workflowInstanceStore.CountAsync(filter, cancellationToken);
 0228    }
 229
 230    private async Task<IEnumerable<WorkflowMatch>> FindStartableWorkflowsAsync(WorkflowsFilter filter, CancellationToken
 231    {
 0232        var stimulusHash = stimulusHasher.Hash(filter.ActivityTypeName, filter.BookmarkPayload, filter.Options.ActivityI
 0233        var triggerBoundWorkflows = await triggerBoundWorkflowService.FindManyAsync(stimulusHash, cancellationToken).ToL
 0234        var correlationId = filter.Options.CorrelationId;
 235
 0236        var query =
 0237                from triggerBoundWorkflow in triggerBoundWorkflows
 0238                from trigger in triggerBoundWorkflow.Triggers
 0239                select new StartableWorkflowMatch(correlationId, trigger.ActivityId, triggerBoundWorkflow.WorkflowGraph.
 240
 0241        return query.ToList();
 0242    }
 243
 244    private async Task<IEnumerable<WorkflowMatch>> FindResumableWorkflowsAsync(WorkflowsFilter filter, CancellationToken
 245    {
 0246        var bookmarkOptions = new FindBookmarkOptions
 0247        {
 0248            CorrelationId = filter.Options.CorrelationId,
 0249            WorkflowInstanceId = filter.Options.WorkflowInstanceId,
 0250            ActivityInstanceId = filter.Options.ActivityInstanceId
 0251        };
 0252        var bookmarkBoundWorkflows = await bookmarkBoundWorkflowService.FindManyAsync(filter.ActivityTypeName, filter.Bo
 253
 0254        return (
 0255                from bookmarkBoundWorkflow in bookmarkBoundWorkflows
 0256                from bookmark in bookmarkBoundWorkflow.Bookmarks
 0257                select new ResumableWorkflowMatch(bookmarkBoundWorkflow.WorkflowInstanceId, bookmark.CorrelationId, book
 0258            .ToList();
 0259    }
 260}