DocSpace-buildtools/common/ASC.Api.Core/Core/CustomEndpointDataSource.cs

60 lines
2.2 KiB
C#
Raw Normal View History

2019-06-25 10:46:10 +00:00
using System.Collections.Generic;
using System.Linq;
2020-03-16 08:25:39 +00:00
using ASC.Web.Api.Routing;
2019-06-25 10:46:10 +00:00
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.Extensions.Primitives;
namespace ASC.Api.Core.Core
{
public class CustomEndpointDataSource : EndpointDataSource
{
public EndpointDataSource Source { get; }
public override IReadOnlyList<Endpoint> Endpoints { get; }
public CustomEndpointDataSource(EndpointDataSource source)
{
Source = source;
var endpoints = Source.Endpoints.Cast<RouteEndpoint>();
2020-03-16 08:25:39 +00:00
Endpoints = endpoints
2021-09-28 11:41:35 +00:00
.SelectMany(r =>
2020-03-16 08:25:39 +00:00
{
2021-09-28 11:41:35 +00:00
var endpoints = new List<RouteEndpoint>();
2020-03-16 08:25:39 +00:00
var attr = r.Metadata.OfType<CustomHttpMethodAttribute>().FirstOrDefault();
2021-09-28 11:41:35 +00:00
var enableFormat = attr == null || !attr.DisableFormat;
if (enableFormat)
{
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText + ".{format}"), r.Order, r.Metadata, r.DisplayName));
}
else
{
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText + ".json"), r.Order - 1, r.Metadata, r.DisplayName));
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText + ".xml"), r.Order - 1, r.Metadata, r.DisplayName));
2021-09-28 11:41:35 +00:00
}
return endpoints;
2020-03-16 08:25:39 +00:00
})
.ToList();
2019-06-25 10:46:10 +00:00
}
public override IChangeToken GetChangeToken()
{
return Source.GetChangeToken();
}
}
public static class EndpointExtension
{
public static IEndpointRouteBuilder MapCustom(this IEndpointRouteBuilder endpoints)
{
endpoints.DataSources.Add(new CustomEndpointDataSource(endpoints.DataSources.First()));
return endpoints;
}
}
}