VEU.WathBody/3-app/1-lib/Kit.Helpers/Routes/RouteHelpers.cs

179 lines
6.5 KiB
C#

namespace Kit.Helpers.Routes
{
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
public static class RouteHelper_Extensions
{
private static IInlineConstraintResolver CreateInlineConstraintResolver(IServiceProvider serviceProvider)
{
var inlineConstraintResolver = serviceProvider
.GetRequiredService<IInlineConstraintResolver>();
var parameterPolicyFactory = serviceProvider
.GetRequiredService<ParameterPolicyFactory>();
// This inline constraint resolver will return a null constraint for non-IRouteConstraint
// parameter policies so Route does not error
return new BackCompatInlineConstraintResolver(inlineConstraintResolver, parameterPolicyFactory);
}
internal class NullRouteConstraint : IRouteConstraint
{
public static readonly NullRouteConstraint Instance = new NullRouteConstraint();
private NullRouteConstraint()
{
}
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
return true;
}
}
private class BackCompatInlineConstraintResolver : IInlineConstraintResolver
{
private readonly IInlineConstraintResolver _inner;
private readonly ParameterPolicyFactory _parameterPolicyFactory;
public BackCompatInlineConstraintResolver(IInlineConstraintResolver inner, ParameterPolicyFactory parameterPolicyFactory)
{
_inner = inner;
_parameterPolicyFactory = parameterPolicyFactory;
}
public IRouteConstraint ResolveConstraint(string inlineConstraint)
{
var routeConstraint = _inner.ResolveConstraint(inlineConstraint);
if (routeConstraint != null)
{
return routeConstraint;
}
var parameterPolicy = _parameterPolicyFactory.Create(null, inlineConstraint);
if (parameterPolicy != null)
{
// Logic inside Route will skip adding NullRouteConstraint
return NullRouteConstraint.Instance;
}
return null;
}
}
public static RouteFluent AddRoute(this IRouteBuilder routeBuilder, string name, string url)
{
var inline = CreateInlineConstraintResolver(routeBuilder.ServiceProvider);
var route = new Route(routeBuilder.DefaultHandler, name, url, null, null, null, inline);
routeBuilder.Routes.Add(route);
return new RouteFluent { Route = route };
}
public static RouteFluent AddRoute(this IRouteBuilder routeBuilder, string name, string url, string controller, string action)
{
var inline = CreateInlineConstraintResolver(routeBuilder.ServiceProvider);
var route = new Route(routeBuilder.DefaultHandler, name, url, new RouteValueDictionary(new { controller = controller, action = action }), null, null, inline);
routeBuilder.Routes.Add(route);
return new RouteFluent { Route = route };
}
public static ControllerRouteFluent<TController> AddController<TController>(this IRouteBuilder routeTable)
where TController : ControllerBase
{
return new ControllerRouteFluent<TController>(routeTable);
}
public static RouteBase GetBaseRoute(this ControllerContext context)
{
return context.GetBaseRoute();
//ParentActionViewContext != null
// ? context.ParentActionViewContext.GetBaseRoute()
// : context.GetBaseRoute();
}
}
}
//public class PermissionGroup
//{
// public RouteEx Route { get; set; }
// public string Group { get; set; }
//}
//public static class RouteHelpers
//{
// public static RouteEx IsHttpGet(this RouteEx route)
// {
// route.Route.DataTokens.Add("APP_IsHttpGet", true);
// return route;
// }
// public static RouteEx IsHttpPost(this RouteEx route)
// {
// route.Route.DataTokens.Add("APP_IsHttpPost", true);
// return route;
// }
// public static RouteEx AddRoute(this RouteCollection routes, string url)
// {
// return new RouteEx
// {
// Route = routes.MapRoute(null, url)
// };
// }
// public static RouteEx AddRoute(this RouteCollection routes, string url, object defaults)
// {
// return new RouteEx
// {
// Route = routes.MapRoute(null, url, defaults)
// };
// }
// public static PermissionGroup AddGroupPermission(this RouteEx route, string key, string permission)
// {
// var group = new PermissionGroup
// {
// Route = route,
// Group = $"{Guid.NewGuid()}"
// .Replace("-", string.Empty)
// .Replace("{", string.Empty)
// .Replace("}", string.Empty)
// .ToLower()
// };
// Dictionary<string, List<KeyValuePair<string, string>>> permissions = null;
// if (route.Route.DataTokens.ContainsKey("APP_RoutePermission"))
// {
// permissions = route.Route.DataTokens["APP_RoutePermission"] as Dictionary<string, List<KeyValuePair<string, string>>>;
// }
// else
// {
// permissions = new Dictionary<string, List<KeyValuePair<string, string>>>();
// route.Route.DataTokens.Add("APP_RoutePermission", permissions);
// }
// var item = new List<KeyValuePair<string, string>>();
// item.Add(new KeyValuePair<string, string>(key, permission));
// permissions.Add(group.Group, item);
// route.Route.DataTokens["APP_RoutePermission"] = permissions;
// return group;
// }
// public static PermissionGroup AddPermission(this PermissionGroup route, string key, string permission)
// {
// var permissions = route.Route.Route.DataTokens["APP_RoutePermission"] as Dictionary<string, List<KeyValuePair<string, string>>>;
// permissions[route.Group].Add(new KeyValuePair<string, string>(key, permission));
// route.Route.Route.DataTokens["APP_RoutePermission"] = permissions;
// return route;
// }
//}