< Summary

Information
Class: Elsa.WorkflowProviders.BlobStorage.Providers.BlobStorageWorkflowsProvider
Assembly: Elsa.WorkflowProviders.BlobStorage
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.WorkflowProviders.BlobStorage/Providers/BlobStorageWorkflowsProvider.cs
Line coverage
95%
Covered lines: 44
Uncovered lines: 2
Coverable lines: 46
Total lines: 93
Line coverage: 95.6%
Branch coverage
72%
Covered branches: 13
Total branches: 18
Branch coverage: 72.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Name()100%11100%
GetWorkflowsAsync()100%44100%
TryReadWorkflowAsync()66.66%121290.9%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.WorkflowProviders.BlobStorage/Providers/BlobStorageWorkflowsProvider.cs

#LineLine coverage
 1using Elsa.Extensions;
 2using Elsa.WorkflowProviders.BlobStorage.Contracts;
 3using Elsa.Workflows.Runtime;
 4using FluentStorage.Blobs;
 5using JetBrains.Annotations;
 6
 7namespace Elsa.WorkflowProviders.BlobStorage.Providers;
 8
 9/// <summary>
 10/// A workflow definition provider that loads workflow definitions from a storage using FluentStorage (See https://githu
 11/// </summary>
 12[PublicAPI]
 13public class BlobStorageWorkflowsProvider : IWorkflowsProvider
 14{
 15    private readonly IBlobStorageProvider _blobStorageProvider;
 16    private readonly IEnumerable<IBlobWorkflowFormatHandler> _handlers;
 17
 18    /// <summary>
 19    /// Initializes a new instance of the <see cref="BlobStorageWorkflowsProvider"/> class.
 20    /// </summary>
 30021    public BlobStorageWorkflowsProvider(
 30022        IBlobStorageProvider blobStorageProvider,
 30023        IEnumerable<IBlobWorkflowFormatHandler> handlers)
 24    {
 30025        _blobStorageProvider = blobStorageProvider;
 30026        _handlers = handlers;
 30027    }
 28
 29    /// <inheritdoc />
 43230    public string Name => "FluentStorage";
 31
 32    /// <inheritdoc />
 33    public async ValueTask<IEnumerable<MaterializedWorkflow>> GetWorkflowsAsync(CancellationToken cancellationToken = de
 34    {
 35        // Aggregate supported extensions from all handlers
 3636        var supportedExtensions = _handlers
 7237            .SelectMany(h => h.SupportedExtensions)
 7238            .Where(ext => !string.IsNullOrEmpty(ext))
 7239            .Select(ext => ext.ToLowerInvariant())
 3640            .ToHashSet();
 41
 3642        var options = new ListOptions
 3643        {
 3644            Recurse = true,
 3645            BrowseFilter = blob =>
 3646            {
 3647                // If no handlers declare extensions, accept all files
 154848                if (supportedExtensions.Count == 0)
 049                    return true;
 3650
 3651                // Only accept files with supported extensions
 154852                var extension = Path.GetExtension(blob.Name).TrimStart('.').ToLowerInvariant();
 154853                return supportedExtensions.Contains(extension);
 3654            }
 3655        };
 56
 3657        var blobStorage = _blobStorageProvider.GetBlobStorage();
 3658        var blobs = await blobStorage.ListFilesAsync(options, cancellationToken);
 3659        var results = new List<MaterializedWorkflow>();
 60
 180061        foreach (var blob in blobs)
 62        {
 86463            var workflow = await TryReadWorkflowAsync(blob, cancellationToken);
 86464            if (workflow != null)
 86465                results.Add(workflow);
 66        }
 67
 3668        return results;
 3669    }
 70
 71    private async Task<MaterializedWorkflow?> TryReadWorkflowAsync(Blob blob, CancellationToken cancellationToken)
 72    {
 86473        var blobStorage = _blobStorageProvider.GetBlobStorage();
 86474        var content = await blobStorage.ReadTextAsync(blob.FullPath, cancellationToken: cancellationToken);
 86475        var contentType = blob.Properties.TryGetValue("ContentType", out var ct) ? ct?.ToString() : null;
 76
 259277        foreach (var handler in _handlers)
 78        {
 86479            if (!handler.SupportsExtension(blob.GetExtension()))
 80                continue;
 81
 86482            if (!handler.CanHandle(blob, contentType))
 83                continue;
 84
 86485            var result = await handler.TryParseAsync(blob, content, cancellationToken);
 86486            if (result != null)
 86487                return result;
 88        }
 89
 90        // No handler accepted this blob; ignore it
 091        return null;
 86492    }
 93}