< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.BulkPublish.BulkPublish
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/BulkPublish/Endpoint.cs
Line coverage
15%
Covered lines: 9
Uncovered lines: 49
Coverable lines: 58
Total lines: 113
Line coverage: 15.5%
Branch coverage
0%
Covered branches: 0
Total branches: 22
Branch coverage: 0%
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()0%506220%

File(s)

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

#LineLine coverage
 1using Elsa.Authorization;
 2using Elsa.Abstractions;
 3using Elsa.Common.Models;
 4using Elsa.Workflows.Api.Constants;
 5using Elsa.Workflows.Api.Requirements;
 6using Elsa.Workflows.Api.Security;
 7using Elsa.Workflows.Management;
 8using Elsa.Workflows.Management.Entities;
 9using Elsa.Workflows.Management.Filters;
 10using JetBrains.Annotations;
 11using Microsoft.AspNetCore.Authorization;
 12
 13namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.BulkPublish;
 14
 15[PublicAPI]
 316internal class BulkPublish(
 317    IWorkflowDefinitionStore store,
 318    IWorkflowDefinitionPublisher workflowDefinitionPublisher,
 319    IAuthorizationService authorizationService,
 320    IWorkflowDefinitionService workflowDefinitionService,
 321    WorkflowDefinitionScriptAuthorizationService scriptAuthorizationService)
 22    : ElsaEndpoint<Request, Response>
 23{
 24    public override void Configure()
 25    {
 326        Post("/bulk-actions/publish/workflow-definitions/by-definition-ids");
 327        RequirePermission(Elsa.Workflows.Api.Permissions.WorkflowPermissions.Definitions, "publish");
 328    }
 29
 30    public override async Task<Response> ExecuteAsync(Request request, CancellationToken cancellationToken)
 31    {
 032        var authorizationResult = await authorizationService.AuthorizeAsync(User, new NotReadOnlyResource(), Authorizati
 33
 034        if (!authorizationResult.Succeeded)
 35        {
 036            await Send.ForbiddenAsync(cancellationToken);
 037            return null!;
 38        }
 39
 040        var published = new List<string>();
 041        var notFound = new List<string>();
 042        var alreadyPublished = new List<string>();
 043        var skipped = new List<string>();
 044        var updatedConsumers = new List<string>();
 045        var failed = new List<string>();
 046        var warnings = new Dictionary<string, ICollection<string>>();
 047        var publishableDefinitions = new List<(string DefinitionId, WorkflowDefinition Definition)>();
 48
 049        var definitions = (await store.FindManyAsync(new WorkflowDefinitionFilter
 050        {
 051            DefinitionIds = request.DefinitionIds,
 052            VersionOptions = VersionOptions.Latest
 053        }, cancellationToken: cancellationToken))
 054            .DistinctBy(x => x.DefinitionId)
 055            .ToDictionary(x => x.DefinitionId);
 56
 057        foreach (var definitionId in request.DefinitionIds)
 58        {
 059            if (!definitions.TryGetValue(definitionId, out var definition))
 60            {
 061                notFound.Add(definitionId);
 062                continue;
 63            }
 64
 065            if (definition.IsPublished)
 66            {
 067                alreadyPublished.Add(definitionId);
 068                continue;
 69            }
 70
 071            if (definition.IsReadonly)
 72            {
 073                skipped.Add(definitionId);
 074                continue;
 75            }
 76
 077            publishableDefinitions.Add((definitionId, definition));
 78        }
 79
 080        foreach (var (_, definition) in publishableDefinitions)
 81        {
 082            var workflowGraph = await workflowDefinitionService.MaterializeWorkflowAsync(definition, cancellationToken);
 083            var scriptAuthorizationResult = await scriptAuthorizationService.AuthorizeAsync(workflowGraph.Workflow, canc
 084            if (!scriptAuthorizationResult.Succeeded)
 85            {
 086                await WorkflowDefinitionScriptAuthorizationFailure.SendAsync(scriptAuthorizationResult, message => AddEr
 087                return null!;
 88            }
 89        }
 90
 091        foreach (var (definitionId, definition) in publishableDefinitions)
 92        {
 093            var result = await workflowDefinitionPublisher.PublishAsync(definition, cancellationToken);
 94
 095            if (!result.Succeeded)
 96            {
 097                failed.Add(definitionId);
 098                continue;
 99            }
 100
 0101            published.Add(definitionId);
 102
 0103            if (result.ValidationErrors.Count > 0)
 0104                warnings[definitionId] = result.ValidationErrors.Select(x => x.Message).ToList();
 105
 0106            if (result.AffectedWorkflows.WorkflowDefinitions.Count > 0)
 0107                updatedConsumers.AddRange(result.AffectedWorkflows.WorkflowDefinitions.Select(x => x.DefinitionId));
 0108        }
 109
 0110        return new(published, alreadyPublished, notFound, skipped, updatedConsumers, failed, warnings);
 0111    }
 112
 113}