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

75 lines
3.0 KiB
C#
Raw Normal View History

2022-03-14 10:57:59 +00:00
using ASC.Api.Core.Routing;
namespace ASC.Api.Core.Core;
public class CustomEndpointDataSource : EndpointDataSource
2019-06-25 10:46:10 +00:00
{
public EndpointDataSource Source { get; }
public override IReadOnlyList<Endpoint> Endpoints { get; }
2021-09-28 11:41:35 +00:00
public CustomEndpointDataSource(EndpointDataSource source)
{
Source = source;
var endpoints = Source.Endpoints.Cast<RouteEndpoint>();
Endpoints = endpoints
.SelectMany(r =>
{
var endpoints = new List<RouteEndpoint>();
2021-09-28 11:41:35 +00:00
var attr = r.Metadata.OfType<CustomHttpMethodAttribute>().FirstOrDefault();
2022-03-14 10:57:59 +00:00
var constraintRouteAttr = r.Metadata.OfType<ConstraintRoute>().FirstOrDefault();
var enableFormat = attr == null || !attr.DisableFormat;
2021-09-28 11:41:35 +00:00
2022-03-14 10:57:59 +00:00
if (r.RoutePattern.Parameters.Any() && constraintRouteAttr != null)
{
2022-03-14 10:57:59 +00:00
var routeValueDictionary = new RouteValueDictionary
{
{ r.RoutePattern.Parameters.FirstOrDefault().Name, constraintRouteAttr.GetRouteConstraint() }
};
AddEndpoints(r.RoutePattern.Defaults, routeValueDictionary);
}
else
{
2022-03-14 10:57:59 +00:00
AddEndpoints();
}
2022-03-14 10:57:59 +00:00
return endpoints;
2022-03-14 10:57:59 +00:00
void AddEndpoints(IReadOnlyDictionary<string, object> defaults = null, RouteValueDictionary policies = null)
{
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText, defaults, policies), r.Order, r.Metadata, r.DisplayName));
if (enableFormat)
{
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText + ".{format}", defaults, policies), r.Order, r.Metadata, r.DisplayName));
}
else
{
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText + ".json", defaults, policies), r.Order - 1, r.Metadata, r.DisplayName));
endpoints.Add(new RouteEndpoint(r.RequestDelegate, RoutePatternFactory.Parse(r.RoutePattern.RawText + ".xml", defaults, policies), r.Order - 1, r.Metadata, r.DisplayName));
}
}
}).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)
2019-06-25 10:46:10 +00:00
{
2022-03-14 10:57:59 +00:00
endpoints.MapControllers();
var sources = endpoints.DataSources.First();
endpoints.DataSources.Clear();
endpoints.DataSources.Add(new CustomEndpointDataSource(sources));
return endpoints;
2019-06-25 10:46:10 +00:00
}
}