From 73210948aa9140cb68abd4165cb6fd392ae3ff44 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Tue, 27 Oct 2020 00:24:49 +0100 Subject: [PATCH] ZeroController as base for frontend --- .../Controllers/DefaultRouteController.cs | 8 ++-- zero.Web/Controllers/ZeroController.cs | 44 +++++++++++++++++++ zero.Web/Routing/ZeroRoutesTransformer.cs | 8 +++- 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 zero.Web/Controllers/ZeroController.cs diff --git a/zero.Web/Controllers/DefaultRouteController.cs b/zero.Web/Controllers/DefaultRouteController.cs index 4c5c498b..22943d87 100644 --- a/zero.Web/Controllers/DefaultRouteController.cs +++ b/zero.Web/Controllers/DefaultRouteController.cs @@ -1,18 +1,20 @@ using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; +using System; +using System.Linq.Expressions; +using zero.Core.Routing; namespace zero.Web.Controllers { - public class DefaultRouteController : Controller + public class DefaultRouteController : ZeroController { public DefaultRouteController() { - } public IActionResult Index() { - return Json(HttpContext.Request.RouteValues, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.None }); + return Json(new { Application, Route }, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.None }); } } } diff --git a/zero.Web/Controllers/ZeroController.cs b/zero.Web/Controllers/ZeroController.cs new file mode 100644 index 00000000..cefcef3b --- /dev/null +++ b/zero.Web/Controllers/ZeroController.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using zero.Core.Entities; +using zero.Core.Routing; + +namespace zero.Web.Controllers +{ + public abstract class ZeroController : ZeroController + { + + } + + + public abstract class ZeroController : Controller where T : IResolvedRoute + { + protected IApplication Application { get; set; } + + protected virtual T Route { get; set; } + + + public override void OnActionExecuting(ActionExecutingContext filterContext) + { + if (filterContext.RouteData.Values.TryGetValue("zero.app", out object app)) + { + Application = (IApplication)app; + } + + if (filterContext.RouteData.Values.TryGetValue("zero.route", out object route)) + { + if (!(route is T)) + { + throw new InvalidCastException($"Could not cast IResolvedRoute to {typeof(T)}"); + } + Route = (T)route; + } + base.OnActionExecuting(filterContext); + } + } +} diff --git a/zero.Web/Routing/ZeroRoutesTransformer.cs b/zero.Web/Routing/ZeroRoutesTransformer.cs index 97eab1e6..d14e1825 100644 --- a/zero.Web/Routing/ZeroRoutesTransformer.cs +++ b/zero.Web/Routing/ZeroRoutesTransformer.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using System.Threading.Tasks; +using zero.Core.Api; using zero.Core.Routing; namespace zero.Web.Routing @@ -9,10 +10,12 @@ namespace zero.Web.Routing public class ZeroRoutesTransformer : DynamicRouteValueTransformer { IRoutes Routes; + IApplicationContext Context; - public ZeroRoutesTransformer(IRoutes routes) + public ZeroRoutesTransformer(IRoutes routes, IApplicationContext context) { Routes = routes; + Context = context; } @@ -27,7 +30,8 @@ namespace zero.Web.Routing RouteProviderEndpoint endpoint = Routes.GetEndpoint(route.Route); - values["route"] = route; + values["zero.app"] = await Context.Resolve(httpContext); + values["zero.route"] = route; values["controller"] = endpoint.Controller; values["action"] = endpoint.Action;