< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Import.Import
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Import/Endpoint.cs
Line coverage
52%
Covered lines: 25
Uncovered lines: 23
Coverable lines: 48
Total lines: 101
Line coverage: 52%
Branch coverage
14%
Covered branches: 2
Total branches: 14
Branch coverage: 14.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%
Configure()100%11100%
HandleAsync()20%251047.36%
ImportSingleWorkflowDefinitionAsync()0%2040%

File(s)

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

#LineLine coverage
 1using Elsa.Abstractions;
 2using Elsa.Workflows.Api.Security;
 3using Elsa.Workflows.Management;
 4using Elsa.Workflows.Management.Models;
 5using JetBrains.Annotations;
 6using Microsoft.AspNetCore.Authorization;
 7
 8namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Import;
 9
 10/// <summary>
 11/// Imports JSON and/or ZIP files containing a workflow definitions.
 12/// </summary>
 13[PublicAPI]
 14internal class Import : ElsaEndpoint<WorkflowDefinitionModel>
 15{
 16    private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
 17    private readonly IWorkflowDefinitionImporter _workflowDefinitionImporter;
 18    private readonly IWorkflowDefinitionLinker _linker;
 19    private readonly IAuthorizationService _authorizationService;
 20    private readonly WorkflowDefinitionScriptAuthorizationService _scriptAuthorizationService;
 21
 22    /// <inheritdoc />
 423    public Import(
 424        IWorkflowDefinitionStore workflowDefinitionStore,
 425        IWorkflowDefinitionImporter workflowDefinitionImporter,
 426        IWorkflowDefinitionLinker linker,
 427        IAuthorizationService authorizationService,
 428        WorkflowDefinitionScriptAuthorizationService scriptAuthorizationService)
 29    {
 430        _workflowDefinitionStore = workflowDefinitionStore;
 431        _workflowDefinitionImporter = workflowDefinitionImporter;
 432        _linker = linker;
 433        _authorizationService = authorizationService;
 434        _scriptAuthorizationService = scriptAuthorizationService;
 435    }
 36
 37    /// <inheritdoc />
 38    public override void Configure()
 39    {
 340        Routes("workflow-definitions/import", "workflow-definitions/{definitionId}/import");
 341        Verbs(FastEndpoints.Http.POST, FastEndpoints.Http.PUT);
 342        ConfigurePermissions("write:workflow-definitions");
 343    }
 44
 45    /// <inheritdoc />
 46    public override async Task HandleAsync(WorkflowDefinitionModel model, CancellationToken cancellationToken)
 47    {
 148        var definitionId = model.DefinitionId;
 149        var isNew = string.IsNullOrWhiteSpace(definitionId);
 50
 151        var scriptAuthorizationResult = await _scriptAuthorizationService.AuthorizeAsync(model, User, cancellationToken)
 152        if (!scriptAuthorizationResult.Succeeded)
 53        {
 054            await WorkflowDefinitionScriptAuthorizationFailure.SendAsync(scriptAuthorizationResult, Send.ForbiddenAsync,
 055            return;
 56        }
 57
 158        var authorizationResult = await _authorizationService.AuthorizeWorkflowDefinitionImportAsync(User, _workflowDefi
 59
 160        if (!authorizationResult.Succeeded)
 61        {
 162            await Send.ForbiddenAsync(cancellationToken);
 163            return;
 64        }
 65
 066        var result = await ImportSingleWorkflowDefinitionAsync(model, cancellationToken);
 067        var definition = result.WorkflowDefinition;
 068        var updatedModel = await _linker.MapAsync(definition, cancellationToken);
 69
 070        if (result.Succeeded)
 71        {
 072            if (isNew)
 073                await Send.CreatedAtAsync<GetByDefinitionId.GetByDefinitionId>(new { DefinitionId = definitionId }, upda
 74            else
 075                await Send.OkAsync(updatedModel, cancellationToken);
 76        }
 77
 078        if (ValidationFailed)
 079            await Send.ErrorsAsync(400, cancellationToken);
 180    }
 81
 82    private async Task<ImportWorkflowResult> ImportSingleWorkflowDefinitionAsync(WorkflowDefinitionModel model, Cancella
 83    {
 84        // Import workflow
 085        var saveWorkflowRequest = new SaveWorkflowDefinitionRequest
 086        {
 087            Model = model,
 088            Publish = false,
 089        };
 90
 091        var result = await _workflowDefinitionImporter.ImportAsync(saveWorkflowRequest, cancellationToken);
 92
 093        if (result.Succeeded)
 094            return result;
 95
 096        foreach (var validationError in result.ValidationErrors)
 097            AddError(validationError.Message);
 98
 099        return result;
 0100    }
 101}