From edfb6ec2e587f85c1e41eda14ee46e0e8dbf3589 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Tue, 27 Oct 2020 11:50:20 +0100 Subject: [PATCH] introduct IPageEndpointResolver which resolves a route to an MVC endpoint --- zero.Core/Api/ApplicationContext.cs | 5 ++++ zero.Core/Routing/AbtractRouteProvider.cs | 25 +++++++++++++------ zero.Core/Routing/IRouteProvider.cs | 7 +++--- .../Routing/Page/IPageEndpointResolver.cs | 18 +++++++++++++ .../Routing/{ => Page}/IPageUrlBuilder.cs | 0 .../Routing/Page/PageEndpointResolver.cs | 23 +++++++++++++++++ zero.Core/Routing/{ => Page}/PageRoute.cs | 0 .../Routing/{ => Page}/PageRouteProvider.cs | 16 +++++++++++- .../Routing/{ => Page}/PageUrlBuilder.cs | 0 zero.Core/Routing/RouteProviderEndpoint.cs | 8 ++++++ zero.Core/Routing/Routes.cs | 14 ++++------- zero.Web/Defaults/ZeroBackofficePlugin.cs | 1 + zero.Web/Routing/ZeroRoutesTransformer.cs | 2 +- 13 files changed, 98 insertions(+), 21 deletions(-) create mode 100644 zero.Core/Routing/Page/IPageEndpointResolver.cs rename zero.Core/Routing/{ => Page}/IPageUrlBuilder.cs (100%) create mode 100644 zero.Core/Routing/Page/PageEndpointResolver.cs rename zero.Core/Routing/{ => Page}/PageRoute.cs (100%) rename zero.Core/Routing/{ => Page}/PageRouteProvider.cs (87%) rename zero.Core/Routing/{ => Page}/PageUrlBuilder.cs (100%) diff --git a/zero.Core/Api/ApplicationContext.cs b/zero.Core/Api/ApplicationContext.cs index f8d19f65..1b0b99d1 100644 --- a/zero.Core/Api/ApplicationContext.cs +++ b/zero.Core/Api/ApplicationContext.cs @@ -60,6 +60,11 @@ namespace zero.Core.Api app = await ResolveFromRequest(context); } + if (app == null) + { + throw new NullReferenceException($"Could not resolve application for host {context.Request.Host}"); + } + App = app; AppId = app?.Id; diff --git a/zero.Core/Routing/AbtractRouteProvider.cs b/zero.Core/Routing/AbtractRouteProvider.cs index a228883c..1ac08194 100644 --- a/zero.Core/Routing/AbtractRouteProvider.cs +++ b/zero.Core/Routing/AbtractRouteProvider.cs @@ -11,21 +11,32 @@ namespace zero.Core.Routing public virtual Type[] AffectedTypes { get; protected set; } - public virtual string Controller { get; protected set; } - - public virtual string Action { get; protected set; } - public const string ID_PREFIX = "routes."; public const char SLASH = '/'; + protected RouteProviderEndpoint DefaultEndpoint { get; set; } + + public AbtractRouteProvider(string alias) { Alias = alias; - AffectedTypes = new Type[1] { typeof(T) }; - Controller = "DefaultRoute"; - Action = "Index"; + AffectedTypes = new Type[1] { typeof(T) }; + DefaultEndpoint = new RouteProviderEndpoint() + { + Controller = "DefaultRoute", + Action = "Index" + }; + } + + + /// + /// Map a route to an MVC endpoint + /// + public virtual RouteProviderEndpoint MapEndpoint(IResolvedRoute route) + { + return DefaultEndpoint; } diff --git a/zero.Core/Routing/IRouteProvider.cs b/zero.Core/Routing/IRouteProvider.cs index 2c2477f9..7f5b3c86 100644 --- a/zero.Core/Routing/IRouteProvider.cs +++ b/zero.Core/Routing/IRouteProvider.cs @@ -26,9 +26,10 @@ namespace zero.Core.Routing Type[] AffectedTypes { get; } - string Controller { get; } - - string Action { get; } + /// + /// Map a route to an MVC endpoint + /// + RouteProviderEndpoint MapEndpoint(IResolvedRoute route); /// /// Resolve a route and load optional dependencies into it. diff --git a/zero.Core/Routing/Page/IPageEndpointResolver.cs b/zero.Core/Routing/Page/IPageEndpointResolver.cs new file mode 100644 index 00000000..c336940b --- /dev/null +++ b/zero.Core/Routing/Page/IPageEndpointResolver.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using zero.Core.Api; +using zero.Core.Entities; + +namespace zero.Core.Routing +{ + public interface IPageEndpointResolver + { + /// + /// Get MVC endpoint for the page route + /// + RouteProviderEndpoint GetEndpoint(PageRoute route); + } +} diff --git a/zero.Core/Routing/IPageUrlBuilder.cs b/zero.Core/Routing/Page/IPageUrlBuilder.cs similarity index 100% rename from zero.Core/Routing/IPageUrlBuilder.cs rename to zero.Core/Routing/Page/IPageUrlBuilder.cs diff --git a/zero.Core/Routing/Page/PageEndpointResolver.cs b/zero.Core/Routing/Page/PageEndpointResolver.cs new file mode 100644 index 00000000..162d6f33 --- /dev/null +++ b/zero.Core/Routing/Page/PageEndpointResolver.cs @@ -0,0 +1,23 @@ +namespace zero.Core.Routing +{ + public class PageEndpointResolver : IPageEndpointResolver + { + protected RouteProviderEndpoint DefaultEndpoint { get; set; } + + + public PageEndpointResolver() + { + DefaultEndpoint = new RouteProviderEndpoint() + { + Controller = "DefaultRoute", + Action = "Index" + }; + } + + + public virtual RouteProviderEndpoint GetEndpoint(PageRoute route) + { + return DefaultEndpoint; + } + } +} diff --git a/zero.Core/Routing/PageRoute.cs b/zero.Core/Routing/Page/PageRoute.cs similarity index 100% rename from zero.Core/Routing/PageRoute.cs rename to zero.Core/Routing/Page/PageRoute.cs diff --git a/zero.Core/Routing/PageRouteProvider.cs b/zero.Core/Routing/Page/PageRouteProvider.cs similarity index 87% rename from zero.Core/Routing/PageRouteProvider.cs rename to zero.Core/Routing/Page/PageRouteProvider.cs index 58382569..48584520 100644 --- a/zero.Core/Routing/PageRouteProvider.cs +++ b/zero.Core/Routing/Page/PageRouteProvider.cs @@ -19,11 +19,25 @@ namespace zero.Core.Routing protected IPageUrlBuilder UrlBuilder { get; set; } + protected IPageEndpointResolver EndpointResolver { get; set; } - public PageRouteProvider(ILogger logger, IPageUrlBuilder urlBuilder) : base("zero.pages") + + public PageRouteProvider(ILogger logger, IPageUrlBuilder urlBuilder, IPageEndpointResolver endpointResolver) : base("zero.pages") { Logger = logger; UrlBuilder = urlBuilder; + EndpointResolver = endpointResolver; + } + + + /// + public override RouteProviderEndpoint MapEndpoint(IResolvedRoute route) + { + if (!(route is PageRoute)) + { + return base.MapEndpoint(route); + } + return EndpointResolver.GetEndpoint(route as PageRoute); } diff --git a/zero.Core/Routing/PageUrlBuilder.cs b/zero.Core/Routing/Page/PageUrlBuilder.cs similarity index 100% rename from zero.Core/Routing/PageUrlBuilder.cs rename to zero.Core/Routing/Page/PageUrlBuilder.cs diff --git a/zero.Core/Routing/RouteProviderEndpoint.cs b/zero.Core/Routing/RouteProviderEndpoint.cs index 1eded02e..9a66e727 100644 --- a/zero.Core/Routing/RouteProviderEndpoint.cs +++ b/zero.Core/Routing/RouteProviderEndpoint.cs @@ -2,6 +2,14 @@ { public class RouteProviderEndpoint { + public RouteProviderEndpoint() { } + + public RouteProviderEndpoint(string controller, string action = "Index") + { + Controller = controller; + Action = action; + } + public string Controller { get; set; } public string Action { get; set; } diff --git a/zero.Core/Routing/Routes.cs b/zero.Core/Routing/Routes.cs index ba04b1a3..0d4876df 100644 --- a/zero.Core/Routing/Routes.cs +++ b/zero.Core/Routing/Routes.cs @@ -102,7 +102,7 @@ namespace zero.Core.Routing /// public async Task ResolveUrl(HttpContext context) { - IApplication app = await Context.ResolveFromRequest(context); + IApplication app = await Context.Resolve(context); string path = context.Request.Path; return await ResolveUrl(app.Id, path); @@ -154,14 +154,10 @@ namespace zero.Core.Routing /// - public RouteProviderEndpoint GetEndpoint(IRoute route) + public RouteProviderEndpoint MapEndpoint(IResolvedRoute route) { - IRouteProvider routeProvider = FindProvider(route.ProviderAlias); - return routeProvider != null ? new RouteProviderEndpoint() - { - Controller = routeProvider.Controller, - Action = routeProvider.Action - } : null; + IRouteProvider routeProvider = FindProvider(route.Route.ProviderAlias); + return routeProvider?.MapEndpoint(route); } @@ -237,6 +233,6 @@ namespace zero.Core.Routing /// /// Get endpoint the route maps to /// - RouteProviderEndpoint GetEndpoint(IRoute route); + RouteProviderEndpoint MapEndpoint(IResolvedRoute route); } } diff --git a/zero.Web/Defaults/ZeroBackofficePlugin.cs b/zero.Web/Defaults/ZeroBackofficePlugin.cs index 26ba9ed6..8a8083b0 100644 --- a/zero.Web/Defaults/ZeroBackofficePlugin.cs +++ b/zero.Web/Defaults/ZeroBackofficePlugin.cs @@ -92,6 +92,7 @@ namespace zero.Web.Defaults services.AddScoped(); services.AddScoped(); + services.AddScoped(); //services.AddTransient(); services.AddScoped(); services.AddScoped(); diff --git a/zero.Web/Routing/ZeroRoutesTransformer.cs b/zero.Web/Routing/ZeroRoutesTransformer.cs index d14e1825..ce83928e 100644 --- a/zero.Web/Routing/ZeroRoutesTransformer.cs +++ b/zero.Web/Routing/ZeroRoutesTransformer.cs @@ -28,7 +28,7 @@ namespace zero.Web.Routing return null; } - RouteProviderEndpoint endpoint = Routes.GetEndpoint(route.Route); + RouteProviderEndpoint endpoint = Routes.MapEndpoint(route); values["zero.app"] = await Context.Resolve(httpContext); values["zero.route"] = route;