< 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
85%
Covered lines: 41
Uncovered lines: 7
Coverable lines: 48
Total lines: 102
Line coverage: 85.4%
Branch coverage
57%
Covered branches: 8
Total branches: 14
Branch coverage: 57.1%
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()70%101084.21%
ImportSingleWorkflowDefinitionAsync()25%4475%

File(s)

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

#LineLine coverage
 1using Elsa.Authorization;
 2using Elsa.Abstractions;
 3using Elsa.Workflows.Api.Security;
 4using Elsa.Workflows.Management;
 5using Elsa.Workflows.Management.Models;
 6using JetBrains.Annotations;
 7using Microsoft.AspNetCore.Authorization;
 8
 9namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Import;
 10
 11/// <summary>
 12/// Imports JSON and/or ZIP files containing a workflow definitions.
 13/// </summary>
 14[PublicAPI]
 15internal class Import : ElsaEndpoint<WorkflowDefinitionModel>
 16{
 17    private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
 18    private readonly IWorkflowDefinitionImporter _workflowDefinitionImporter;
 19    private readonly IWorkflowDefinitionLinker _linker;
 20    private readonly IAuthorizationService _authorizationService;
 21    private readonly WorkflowDefinitionScriptAuthorizationService _scriptAuthorizationService;
 22
 23    /// <inheritdoc />
 524    public Import(
 525        IWorkflowDefinitionStore workflowDefinitionStore,
 526        IWorkflowDefinitionImporter workflowDefinitionImporter,
 527        IWorkflowDefinitionLinker linker,
 528        IAuthorizationService authorizationService,
 529        WorkflowDefinitionScriptAuthorizationService scriptAuthorizationService)
 30    {
 531        _workflowDefinitionStore = workflowDefinitionStore;
 532        _workflowDefinitionImporter = workflowDefinitionImporter;
 533        _linker = linker;
 534        _authorizationService = authorizationService;
 535        _scriptAuthorizationService = scriptAuthorizationService;
 536    }
 37
 38    /// <inheritdoc />
 39    public override void Configure()
 40    {
 341        Routes("workflow-definitions/import", "workflow-definitions/{definitionId}/import");
 342        Verbs(FastEndpoints.Http.POST, FastEndpoints.Http.PUT);
 343        RequirePermission(Elsa.Workflows.Api.Permissions.WorkflowPermissions.Definitions, CoreVerbs.Write);
 344    }
 45
 46    /// <inheritdoc />
 47    public override async Task HandleAsync(WorkflowDefinitionModel model, CancellationToken cancellationToken)
 48    {
 249        var definitionId = model.DefinitionId;
 250        var isNew = string.IsNullOrWhiteSpace(definitionId);
 51
 252        var scriptAuthorizationResult = await _scriptAuthorizationService.AuthorizeAsync(model, cancellationToken);
 253        if (!scriptAuthorizationResult.Succeeded)
 54        {
 055            await WorkflowDefinitionScriptAuthorizationFailure.SendAsync(scriptAuthorizationResult, message => AddError(
 056            return;
 57        }
 58
 259        var authorizationResult = await _authorizationService.AuthorizeWorkflowDefinitionImportAsync(User, _workflowDefi
 60
 261        if (!authorizationResult.Succeeded)
 62        {
 163            await Send.ForbiddenAsync(cancellationToken);
 164            return;
 65        }
 66
 167        var result = await ImportSingleWorkflowDefinitionAsync(model, cancellationToken);
 168        var definition = result.WorkflowDefinition;
 169        var updatedModel = await _linker.MapAsync(definition, cancellationToken);
 70
 171        if (result.Succeeded)
 72        {
 173            if (isNew)
 074                await Send.CreatedAtAsync<GetByDefinitionId.GetByDefinitionId>(new { DefinitionId = definitionId }, upda
 75            else
 176                await Send.OkAsync(updatedModel, cancellationToken);
 77        }
 78
 179        if (ValidationFailed)
 080            await Send.ErrorsAsync(400, cancellationToken);
 281    }
 82
 83    private async Task<ImportWorkflowResult> ImportSingleWorkflowDefinitionAsync(WorkflowDefinitionModel model, Cancella
 84    {
 85        // Import workflow
 186        var saveWorkflowRequest = new SaveWorkflowDefinitionRequest
 187        {
 188            Model = model,
 189            Publish = false,
 190        };
 91
 192        var result = await _workflowDefinitionImporter.ImportAsync(saveWorkflowRequest, cancellationToken);
 93
 194        if (result.Succeeded)
 195            return result;
 96
 097        foreach (var validationError in result.ValidationErrors)
 098            AddError(validationError.Message);
 99
 0100        return result;
 1101    }
 102}