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