< 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>
 22421    public BlobStorageWorkflowsProvider(
 22422        IBlobStorageProvider blobStorageProvider,
 22423        IEnumerable<IBlobWorkflowFormatHandler> handlers)
 24    {
 22425        _blobStorageProvider = blobStorageProvider;
 22426        _handlers = handlers;
 22427    }
 28
 29    /// <inheritdoc />
 88230    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
 6236        var supportedExtensions = _handlers
 12437            .SelectMany(h => h.SupportedExtensions)
 12438            .Where(ext => !string.IsNullOrEmpty(ext))
 12439            .Select(ext => ext.ToLowerInvariant())
 6240            .ToHashSet();
 41
 6242        var options = new ListOptions
 6243        {
 6244            Recurse = true,
 6245            BrowseFilter = blob =>
 6246            {
 6247                // If no handlers declare extensions, accept all files
 235648                if (supportedExtensions.Count == 0)
 049                    return true;
 6250
 6251                // Only accept files with supported extensions
 235652                var extension = Path.GetExtension(blob.Name).TrimStart('.').ToLowerInvariant();
 235653                return supportedExtensions.Contains(extension);
 6254            }
 6255        };
 56
 6257        var blobStorage = _blobStorageProvider.GetBlobStorage();
 6258        var blobs = await blobStorage.ListFilesAsync(options, cancellationToken);
 6259        var results = new List<MaterializedWorkflow>();
 60
 272861        foreach (var blob in blobs)
 62        {
 130263            var workflow = await TryReadWorkflowAsync(blob, cancellationToken);
 130264            if (workflow != null)
 130265                results.Add(workflow);
 66        }
 67
 6268        return results;
 6269    }
 70
 71    private async Task<MaterializedWorkflow?> TryReadWorkflowAsync(Blob blob, CancellationToken cancellationToken)
 72    {
 130273        var blobStorage = _blobStorageProvider.GetBlobStorage();
 130274        var content = await blobStorage.ReadTextAsync(blob.FullPath, cancellationToken: cancellationToken);
 130275        var contentType = blob.Properties.TryGetValue("ContentType", out var ct) ? ct?.ToString() : null;
 76
 390677        foreach (var handler in _handlers)
 78        {
 130279            if (!handler.SupportsExtension(blob.GetExtension()))
 80                continue;
 81
 130282            if (!handler.CanHandle(blob, contentType))
 83                continue;
 84
 130285            var result = await handler.TryParseAsync(blob, content, cancellationToken);
 130286            if (result != null)
 130287                return result;
 88        }
 89
 90        // No handler accepted this blob; ignore it
 091        return null;
 130292    }
 93}