< Summary

Information
Class: Elsa.Workflows.Management.Services.WorkflowDefinitionService
Assembly: Elsa.Workflows.Management
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Services/WorkflowDefinitionService.cs
Line coverage
100%
Covered lines: 72
Uncovered lines: 0
Coverable lines: 72
Total lines: 176
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
Branch coverage: 100%
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.Management/Services/WorkflowDefinitionService.cs

#LineLine coverage
 1using Elsa.Common.Models;
 2using Elsa.Workflows.Management.Entities;
 3using Elsa.Workflows.Management.Exceptions;
 4using Elsa.Workflows.Management.Filters;
 5using Elsa.Workflows.Management.Models;
 6using Elsa.Workflows.Models;
 7using Microsoft.Extensions.Logging;
 8
 9namespace Elsa.Workflows.Management.Services;
 10
 11/// <inheritdoc />
 48312public class WorkflowDefinitionService(
 48313    IWorkflowDefinitionStore workflowDefinitionStore,
 48314    IWorkflowGraphBuilder workflowGraphBuilder,
 48315    IMaterializerRegistry materializerRegistry,
 48316    ILogger<WorkflowDefinitionService> logger)
 17    : IWorkflowDefinitionService
 18{
 19    /// <inheritdoc />
 20    public async Task<WorkflowGraph> MaterializeWorkflowAsync(WorkflowDefinition definition, CancellationToken cancellat
 21    {
 185322        var materializer = materializerRegistry.GetMaterializer(definition.MaterializerName);
 23
 185324        if (materializer == null)
 125            throw new WorkflowMaterializerNotFoundException(definition.MaterializerName);
 26
 185227        var workflow = await materializer.MaterializeAsync(definition, cancellationToken);
 185228        return await workflowGraphBuilder.BuildAsync(workflow, cancellationToken);
 185229    }
 30
 31    /// <inheritdoc />
 32    public Task<WorkflowDefinition?> FindWorkflowDefinitionAsync(string definitionId, VersionOptions versionOptions, Can
 33    {
 2734        var handle = WorkflowDefinitionHandle.ByDefinitionId(definitionId, versionOptions);
 2735        return FindWorkflowDefinitionAsync(handle, cancellationToken);
 36    }
 37
 38    /// <inheritdoc />
 39    public Task<WorkflowDefinition?> FindWorkflowDefinitionAsync(string definitionVersionId, CancellationToken cancellat
 40    {
 9741        var handle = WorkflowDefinitionHandle.ByDefinitionVersionId(definitionVersionId);
 9742        return FindWorkflowDefinitionAsync(handle, cancellationToken);
 43    }
 44
 45    /// <inheritdoc />
 46    public async Task<WorkflowDefinition?> FindWorkflowDefinitionAsync(WorkflowDefinitionHandle handle, CancellationToke
 47    {
 12748        var filter = handle.ToFilter();
 12749        return await workflowDefinitionStore.FindAsync(filter, cancellationToken);
 12750    }
 51
 52    /// <inheritdoc />
 53    public async Task<WorkflowDefinition?> FindWorkflowDefinitionAsync(WorkflowDefinitionFilter filter, CancellationToke
 54    {
 29355        return await workflowDefinitionStore.FindAsync(filter, cancellationToken);
 29356    }
 57
 58    /// <inheritdoc />
 59    public async Task<WorkflowGraph?> FindWorkflowGraphAsync(string definitionId, VersionOptions versionOptions, Cancell
 60    {
 2161        var definition = await FindWorkflowDefinitionAsync(definitionId, versionOptions, cancellationToken);
 2162        return await TryMaterializeWorkflowAsync(definition, cancellationToken);
 2163    }
 64
 65    /// <inheritdoc />
 66    public async Task<WorkflowGraph?> FindWorkflowGraphAsync(string definitionVersionId, CancellationToken cancellationT
 67    {
 9568        var definition = await FindWorkflowDefinitionAsync(definitionVersionId, cancellationToken);
 9569        return await TryMaterializeWorkflowAsync(definition, cancellationToken);
 9570    }
 71
 72    /// <inheritdoc />
 73    public async Task<WorkflowGraph?> FindWorkflowGraphAsync(WorkflowDefinitionHandle definitionHandle, CancellationToke
 74    {
 175        var definition = await FindWorkflowDefinitionAsync(definitionHandle, cancellationToken);
 176        return await TryMaterializeWorkflowAsync(definition, cancellationToken);
 177    }
 78
 79    /// <inheritdoc />
 80    public async Task<WorkflowGraph?> FindWorkflowGraphAsync(WorkflowDefinitionFilter filter, CancellationToken cancella
 81    {
 9782        var definition = await FindWorkflowDefinitionAsync(filter, cancellationToken);
 9783        return await TryMaterializeWorkflowAsync(definition, cancellationToken);
 9784    }
 85
 86    /// <inheritdoc />
 87    public async Task<IEnumerable<WorkflowGraph>> FindWorkflowGraphsAsync(WorkflowDefinitionFilter filter, CancellationT
 88    {
 189        var workflowDefinitions = await workflowDefinitionStore.FindManyAsync(filter, cancellationToken);
 190        var workflowGraphs = new List<WorkflowGraph>();
 691        foreach (var workflowDefinition in workflowDefinitions)
 92        {
 293            var workflowGraph = await MaterializeWorkflowAsync(workflowDefinition, cancellationToken);
 294            workflowGraphs.Add(workflowGraph);
 95        }
 96
 197        return workflowGraphs;
 198    }
 99
 100    public async Task<WorkflowGraphFindResult> TryFindWorkflowGraphAsync(string definitionId, VersionOptions versionOpti
 101    {
 3102        var definition = await FindWorkflowDefinitionAsync(definitionId, versionOptions, cancellationToken);
 3103        return await MaterializeWorkflowGraphFindResultAsync(definition, cancellationToken);
 3104    }
 105
 106    public async Task<WorkflowGraphFindResult> TryFindWorkflowGraphAsync(string definitionVersionId, CancellationToken c
 107    {
 1108        var definition = await FindWorkflowDefinitionAsync(definitionVersionId, cancellationToken);
 1109        return await MaterializeWorkflowGraphFindResultAsync(definition, cancellationToken);
 1110    }
 111
 112    public async Task<WorkflowGraphFindResult> TryFindWorkflowGraphAsync(WorkflowDefinitionHandle definitionHandle, Canc
 113    {
 1114        var definition = await FindWorkflowDefinitionAsync(definitionHandle, cancellationToken);
 1115        return await MaterializeWorkflowGraphFindResultAsync(definition, cancellationToken);
 1116    }
 117
 118    public async Task<WorkflowGraphFindResult> TryFindWorkflowGraphAsync(WorkflowDefinitionFilter filter, CancellationTo
 119    {
 91120        var definition = await FindWorkflowDefinitionAsync(filter, cancellationToken);
 91121        return await MaterializeWorkflowGraphFindResultAsync(definition, cancellationToken);
 91122    }
 123
 124    public async Task<IEnumerable<WorkflowGraphFindResult>> TryFindWorkflowGraphsAsync(WorkflowDefinitionFilter filter, 
 125    {
 1126        var workflowDefinitions = await workflowDefinitionStore.FindManyAsync(filter, cancellationToken);
 1127        var results = new List<WorkflowGraphFindResult>();
 6128        foreach (var workflowDefinition in workflowDefinitions)
 129        {
 2130            var result = await MaterializeWorkflowGraphFindResultAsync(workflowDefinition, cancellationToken);
 2131            results.Add(result);
 132        }
 133
 1134        return results;
 1135    }
 136
 137    /// <summary>
 138    /// Attempts to materialize a workflow graph from the given workflow definition if a suitable materializer is availa
 139    /// </summary>
 140    /// <param name="definition">The workflow definition to materialize. Can be null.</param>
 141    /// <param name="cancellationToken">A token to monitor for cancellation requests.</param>
 142    /// <returns>
 143    /// A <see cref="WorkflowGraph"/> if materialization is successful; otherwise, null.
 144    /// </returns>
 145    private async Task<WorkflowGraph?> TryMaterializeWorkflowAsync(WorkflowDefinition? definition, CancellationToken can
 146    {
 214147        if (definition == null)
 2148            return null;
 149
 212150        if (materializerRegistry.IsMaterializerAvailable(definition.MaterializerName))
 211151            return await MaterializeWorkflowAsync(definition, cancellationToken);
 152
 1153        logger.LogWarning("Materializer '{MaterializerName}' not found. The workflow definition will not be materialized
 1154        return null;
 214155    }
 156
 157    /// <summary>
 158    /// Attempts to materialize a workflow graph from the given workflow definition.
 159    /// </summary>
 160    /// <param name="definition">The workflow definition to materialize the graph for. May be null.</param>
 161    /// <param name="cancellationToken">A token to observe while waiting for the task to complete.</param>
 162    /// <returns>A result containing the materialized workflow graph and its corresponding workflow definition, if succe
 163    private async Task<WorkflowGraphFindResult> MaterializeWorkflowGraphFindResultAsync(WorkflowDefinition? definition, 
 164    {
 98165        if (definition == null)
 1166            return new(null, null);
 167
 97168        if (materializerRegistry.IsMaterializerAvailable(definition.MaterializerName))
 169        {
 95170            var graph = await MaterializeWorkflowAsync(definition, cancellationToken);
 95171            return new(definition, graph);
 172        }
 173
 2174        return new(definition, null);
 98175    }
 176}