< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.ImportAuthorizationExtensions
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/ImportAuthorizationExtensions.cs
Line coverage
89%
Covered lines: 35
Uncovered lines: 4
Coverable lines: 39
Total lines: 92
Line coverage: 89.7%
Branch coverage
58%
Covered branches: 7
Total branches: 12
Branch coverage: 58.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AuthorizeWorkflowDefinitionImportAsync()100%11100%
AuthorizeWorkflowDefinitionImportsAsync()62.5%8881.81%
FindExistingDefinitionAsync()50%2287.5%
FindExistingDefinitionsAsync()50%2291.66%

File(s)

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

#LineLine coverage
 1using System.Security.Claims;
 2using Elsa.Common.Models;
 3using Elsa.Workflows.Api.Constants;
 4using Elsa.Workflows.Api.Requirements;
 5using Elsa.Workflows.Management;
 6using Elsa.Workflows.Management.Entities;
 7using Elsa.Workflows.Management.Filters;
 8using Elsa.Workflows.Management.Models;
 9using Microsoft.AspNetCore.Authorization;
 10
 11namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions;
 12
 13internal static class ImportAuthorizationExtensions
 14{
 15    public static async Task<AuthorizationResult> AuthorizeWorkflowDefinitionImportAsync(
 16        this IAuthorizationService authorizationService,
 17        ClaimsPrincipal user,
 18        IWorkflowDefinitionStore workflowDefinitionStore,
 19        WorkflowDefinitionModel model,
 20        CancellationToken cancellationToken)
 21    {
 122        var definition = await FindExistingDefinitionAsync(workflowDefinitionStore, model.DefinitionId, cancellationToke
 123        return await authorizationService.AuthorizeAsync(user, new NotReadOnlyResource(definition), AuthorizationPolicie
 124    }
 25
 26    public static async Task<AuthorizationResult> AuthorizeWorkflowDefinitionImportsAsync(
 27        this IAuthorizationService authorizationService,
 28        ClaimsPrincipal user,
 29        IWorkflowDefinitionStore workflowDefinitionStore,
 30        IEnumerable<WorkflowDefinitionModel> models,
 31        CancellationToken cancellationToken)
 32    {
 133        var modelList = models.ToList();
 34
 135        if (modelList.Count == 0)
 036            return await authorizationService.AuthorizeAsync(user, new NotReadOnlyResource(), AuthorizationPolicies.NotR
 37
 138        var definitions = await FindExistingDefinitionsAsync(workflowDefinitionStore, modelList, cancellationToken);
 39
 540        foreach (var model in modelList)
 41        {
 242            definitions.TryGetValue(model.DefinitionId ?? string.Empty, out var definition);
 243            var authorizationResult = await authorizationService.AuthorizeAsync(user, new NotReadOnlyResource(definition
 44
 245            if (!authorizationResult.Succeeded)
 146                return authorizationResult;
 47        }
 48
 049        return AuthorizationResult.Success();
 150    }
 51
 52    private static async Task<WorkflowDefinition?> FindExistingDefinitionAsync(
 53        IWorkflowDefinitionStore workflowDefinitionStore,
 54        string? definitionId,
 55        CancellationToken cancellationToken)
 56    {
 157        if (string.IsNullOrWhiteSpace(definitionId))
 058            return null;
 59
 160        return await workflowDefinitionStore.FindAsync(new WorkflowDefinitionFilter
 161        {
 162            DefinitionId = definitionId,
 163            VersionOptions = VersionOptions.Latest
 164        }, cancellationToken);
 165    }
 66
 67    private static async Task<IDictionary<string, WorkflowDefinition>> FindExistingDefinitionsAsync(
 68        IWorkflowDefinitionStore workflowDefinitionStore,
 69        IEnumerable<WorkflowDefinitionModel> models,
 70        CancellationToken cancellationToken)
 71    {
 172        var definitionIds = models
 273            .Select(x => x.DefinitionId)
 274            .Where(x => !string.IsNullOrWhiteSpace(x))
 275            .Select(x => x!)
 176            .Distinct(StringComparer.Ordinal)
 177            .ToList();
 78
 179        if (definitionIds.Count == 0)
 080            return new Dictionary<string, WorkflowDefinition>();
 81
 182        var definitions = await workflowDefinitionStore.FindManyAsync(new WorkflowDefinitionFilter
 183        {
 184            DefinitionIds = definitionIds,
 185            VersionOptions = VersionOptions.Latest
 186        }, cancellationToken);
 87
 188        return definitions
 289            .GroupBy(x => x.DefinitionId, StringComparer.Ordinal)
 590            .ToDictionary(x => x.Key, x => x.First(), StringComparer.Ordinal);
 191    }
 92}