< Summary

Information
Class: Elsa.Workflows.Api.Endpoints.OutputConverters.List.OutputConverterDescriptorModel
Assembly: Elsa.Workflows.Api
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Api/Endpoints/OutputConverters/List/Endpoint.cs
Line coverage
100%
Covered lines: 7
Uncovered lines: 0
Coverable lines: 7
Total lines: 111
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Id()100%11100%
get_SourceTypeName()100%11100%
get_ResultTypeName()100%11100%
get_DisplayName()100%11100%
get_Description()100%11100%
get_SettingsSchema()100%11100%

File(s)

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

#LineLine coverage
 1using Elsa.Authorization;
 2using System.Text.Json;
 3using Elsa.Abstractions;
 4using Elsa.Common.Serialization;
 5using Elsa.Extensions;
 6using Elsa.Models;
 7using Elsa.Workflows.Models;
 8using JetBrains.Annotations;
 9using Microsoft.AspNetCore.Http;
 10
 11namespace Elsa.Workflows.Api.Endpoints.OutputConverters.List;
 12
 13/// <summary>
 14/// Lists output converters compatible with declared output and destination types.
 15/// </summary>
 16[PublicAPI]
 17internal class List(IOutputConverterRegistry registry, ISerializationTypeRegistry serializationTypeRegistry) : ElsaEndpo
 18{
 19    /// <inheritdoc />
 20    public override void Configure()
 21    {
 22        Get("/descriptors/output-converters");
 23        RequirePermission(Elsa.Workflows.Api.Permissions.WorkflowPermissions.DescriptorsOutputConverters, CoreVerbs.View
 24    }
 25
 26    /// <inheritdoc />
 27    public override async Task HandleAsync(CancellationToken cancellationToken)
 28    {
 29        var sourceTypeName = Query<string>("sourceType", false);
 30        var destinationTypeName = Query<string>("destinationType", false);
 31
 32        if (!TryListCompatible(sourceTypeName, destinationTypeName, out var response, out var errors))
 33        {
 34            foreach (var error in errors)
 35                AddError(error);
 36
 37            await Send.ErrorsAsync(StatusCodes.Status400BadRequest, cancellationToken);
 38            return;
 39        }
 40
 41        await Send.OkAsync(response, cancellationToken);
 42    }
 43
 44    internal bool TryListCompatible(
 45        string? sourceTypeName,
 46        string? destinationTypeName,
 47        out ListResponse<OutputConverterDescriptorModel> response,
 48        out ICollection<string> errors)
 49    {
 50        errors = [];
 51        var hasSourceType = TryResolveType("sourceType", sourceTypeName, out var sourceType, out var sourceTypeError);
 52        var hasDestinationType = TryResolveType("destinationType", destinationTypeName, out var destinationType, out var
 53
 54        if (!hasSourceType)
 55            errors.Add(sourceTypeError!);
 56
 57        if (!hasDestinationType)
 58            errors.Add(destinationTypeError!);
 59
 60        if (errors.Count > 0)
 61        {
 62            response = new ListResponse<OutputConverterDescriptorModel>([]);
 63            return false;
 64        }
 65
 66        var descriptors = registry.FindCompatible(sourceType, destinationType).Select(Map).ToList();
 67
 68        response = new ListResponse<OutputConverterDescriptorModel>(descriptors);
 69        return true;
 70    }
 71
 72    private bool TryResolveType(string parameterName, string? typeName, out Type type, out string? error)
 73    {
 74        if (string.IsNullOrWhiteSpace(typeName))
 75        {
 76            type = null!;
 77            error = $"The {parameterName} query parameter is required.";
 78            return false;
 79        }
 80
 81        if (SerializationTypeResolver.TryResolveType(serializationTypeRegistry, typeName, out type))
 82        {
 83            error = null;
 84            return true;
 85        }
 86
 87        type = null!;
 88        error = $"The {parameterName} query parameter must be a registered type alias or resolvable safe type name.";
 89        return false;
 90    }
 91
 92    private OutputConverterDescriptorModel Map(OutputConverterDescriptor descriptor) => new(
 93        descriptor.Id,
 94        GetTypeName(descriptor.SourceType),
 95        GetTypeName(descriptor.ResultType),
 96        descriptor.DisplayName,
 97        descriptor.Description,
 98        descriptor.SettingsSchema?.Clone());
 99
 100    private string GetTypeName(Type type) => SerializationTypeResolver.TryGetAlias(serializationTypeRegistry, type, out 
 101        ? alias
 102        : type.GetSimpleAssemblyQualifiedName();
 103}
 104
 1105internal record OutputConverterDescriptorModel(
 1106    string Id,
 1107    string SourceTypeName,
 1108    string ResultTypeName,
 1109    string DisplayName,
 1110    string? Description,
 2111    JsonElement? SettingsSchema);