< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.List.List
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs
Line coverage
80%
Covered lines: 50
Uncovered lines: 12
Coverable lines: 62
Total lines: 131
Line coverage: 80.6%
Branch coverage
73%
Covered branches: 22
Total branches: 30
Branch coverage: 73.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Configure()100%11100%
ExecuteAsync()92.85%1414100%
HasRequiredPermissions(...)100%22100%
CreateFilter(...)50%44100%
FindAsync()50%261045.45%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs

#LineLine coverage
 1using Elsa.Authorization;
 2using Elsa.Abstractions;
 3using Elsa.Common.Entities;
 4using Elsa.Common.Models;
 5using Elsa.Models;
 6using Elsa.Workflows.Api.Models;
 7using Elsa.Workflows.Management;
 8using Elsa.Workflows.Management.Exceptions;
 9using Elsa.Workflows.Management.Filters;
 10using Elsa.Workflows.Management.Models;
 11using JetBrains.Annotations;
 12using Microsoft.AspNetCore.Http;
 13using Microsoft.Extensions.DependencyInjection;
 14
 15namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.List;
 16
 17[PublicAPI]
 1418internal class List(IWorkflowDefinitionStore store, IWorkflowDefinitionLinker linker, IEnumerable<IWorkflowDefinitionFil
 19{
 20    public override void Configure()
 21    {
 1422        Get("/workflow-definitions");
 1423        RequirePermission(Elsa.Workflows.Api.Permissions.WorkflowPermissions.Definitions, CoreVerbs.View);
 1424    }
 25
 26    public override async Task<PagedListResponse<LinkedWorkflowDefinitionSummary>> ExecuteAsync(Request request, Cancell
 27    {
 1128        var pageArgs = PageArgs.FromPage(request.Page, request.PageSize);
 1129        var filter = CreateFilter(request);
 30        try
 31        {
 4032            foreach (var filterProvider in filterProviders ?? [])
 33            {
 1034                if (!filterProvider.CanApply(filter))
 35                {
 36                    continue;
 37                }
 38
 939                if (EndpointSecurityOptions.SecurityIsEnabled && !HasRequiredPermissions(filterProvider, filter))
 40                {
 141                    AddError("You do not have permission to filter workflow definitions by labels.");
 142                    await Send.ErrorsAsync(StatusCodes.Status403Forbidden, cancellationToken);
 143                    return default!;
 44                }
 45
 846                await filterProvider.ApplyAsync(filter, cancellationToken);
 47            }
 948        }
 149        catch (WorkflowDefinitionFilterNotSupportedException exception)
 50        {
 151            AddError(exception.Message);
 152            await Send.ErrorsAsync(StatusCodes.Status501NotImplemented, cancellationToken);
 153            return default!;
 54        }
 55
 956        if (filter.LabelIds is { Count: > 0 })
 57        {
 258            AddError("Filtering workflow definitions by labels is not supported by the configured modules.");
 259            await Send.ErrorsAsync(StatusCodes.Status501NotImplemented, cancellationToken);
 260            return default!;
 61        }
 62
 763        var summaries = await FindAsync(request, filter, pageArgs, cancellationToken);
 764        var pagedList = new PagedListResponse<WorkflowDefinitionSummary>(summaries);
 765        var response = linker.MapAsync(pagedList);
 766        return response;
 1167    }
 68
 69    private bool HasRequiredPermissions(IWorkflowDefinitionFilterProvider filterProvider, WorkflowDefinitionFilter filte
 70    {
 971        var evaluator = HttpContext.RequestServices.GetService<IPermissionEvaluator>() ?? PermissionEvaluator.Shared;
 1772        return filterProvider.GetRequiredPermissions(filter).All(permission => evaluator.HasPermission(HttpContext.User,
 73    }
 74
 75    private WorkflowDefinitionFilter CreateFilter(Request request)
 76    {
 1177        var versionOptions = string.IsNullOrWhiteSpace(request.VersionOptions) ? default(VersionOptions?) : VersionOptio
 78
 1179        return new()
 1180        {
 1181            IsSystem = request.IsSystem,
 1182            VersionOptions = versionOptions,
 1183            SearchTerm = request.SearchTerm?.Trim(),
 1184            MaterializerName = request.MaterializerName,
 1185            DefinitionIds = request.DefinitionIds,
 1186            Ids = request.Ids,
 1187            LabelIds = request.Labels
 1188        };
 89    }
 90
 91    private async Task<Page<WorkflowDefinitionSummary>> FindAsync(Request request, WorkflowDefinitionFilter filter, Page
 92    {
 793        request.OrderBy ??= OrderByWorkflowDefinition.Name;
 94
 795        var direction = request.OrderBy == OrderByWorkflowDefinition.Name ? request.OrderDirection ?? OrderDirection.Asc
 96
 797        switch (request.OrderBy)
 98        {
 99            default:
 100                {
 0101                    var order = new WorkflowDefinitionOrder<DateTimeOffset>
 0102                    {
 0103                        KeySelector = p => p.CreatedAt,
 0104                        Direction = direction
 0105                    };
 106
 0107                    return await store.FindSummariesAsync(filter, order, pageArgs, cancellationToken);
 108                }
 109            case OrderByWorkflowDefinition.Name:
 110                {
 7111                    var order = new WorkflowDefinitionOrder<string>
 7112                    {
 7113                        KeySelector = p => p.Name!,
 7114                        Direction = direction
 7115                    };
 116
 7117                    return await store.FindSummariesAsync(filter, order, pageArgs, cancellationToken);
 118                }
 119            case OrderByWorkflowDefinition.Version:
 120                {
 0121                    var order = new WorkflowDefinitionOrder<int>
 0122                    {
 0123                        KeySelector = p => p.Version,
 0124                        Direction = direction
 0125                    };
 126
 0127                    return await store.FindSummariesAsync(filter, order, pageArgs, cancellationToken);
 128                }
 129        }
 7130    }
 131}