From c4d6e98636fc3c2612d8c8384b34ad4b5b3084ec Mon Sep 17 00:00:00 2001 From: Herman Ho Date: Wed, 13 Sep 2023 03:23:27 +0100 Subject: [PATCH] feat: use endpoint routing --- src/Postal.AspNetCore/Email.cs | 19 ++++++++++++++++-- src/Postal.AspNetCore/EmailService.cs | 7 ++++++- src/Postal.AspNetCore/EmailViewRender.cs | 11 +--------- src/Postal.AspNetCore/HttpContextData.cs | 16 +++++++++++++++ .../InternalClass/EndpointFeature.cs | 20 +++++++++++++++++++ .../TemplateServices/ITemplateService.cs | 2 +- .../TemplateServices/TemplateService.cs | 14 ++++++++++--- 7 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 src/Postal.AspNetCore/HttpContextData.cs create mode 100644 src/Postal.AspNetCore/InternalClass/EndpointFeature.cs diff --git a/src/Postal.AspNetCore/Email.cs b/src/Postal.AspNetCore/Email.cs index 3930a2b..646ae74 100644 --- a/src/Postal.AspNetCore/Email.cs +++ b/src/Postal.AspNetCore/Email.cs @@ -3,9 +3,10 @@ using System.Dynamic; using System.Net.Mail; using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ViewFeatures; -using Microsoft.AspNetCore.Routing; using Postal.AspNetCore; namespace Postal @@ -131,7 +132,21 @@ string DeriveViewNameFromClassName() return viewName; } - public IList Routers { get; set; } public RequestPath RequestPath { get; set; } + internal HttpContextData HttpContextData { get; private set; } + + public void CaptureHttpContext(HttpContext httpContext) + { + var endpoint = httpContext.GetEndpoint(); + var routeValues = httpContext.Features.Get()?.RouteValues; + HttpContextData = new HttpContextData { Endpoint = endpoint, RouteValues = routeValues }; + + RequestPath = new RequestPath(); + RequestPath.PathBase = httpContext.Request.PathBase.ToString(); + RequestPath.Host = httpContext.Request.Host.ToString(); + RequestPath.IsHttps = httpContext.Request.IsHttps; + RequestPath.Scheme = httpContext.Request.Scheme; + RequestPath.Method = httpContext.Request.Method; + } } } \ No newline at end of file diff --git a/src/Postal.AspNetCore/EmailService.cs b/src/Postal.AspNetCore/EmailService.cs index c252609..de522e1 100644 --- a/src/Postal.AspNetCore/EmailService.cs +++ b/src/Postal.AspNetCore/EmailService.cs @@ -30,7 +30,12 @@ public static EmailService Create(IServiceProvider serviceProvider, Func /// Creates a new . /// - public EmailService(IEmailViewRender emailViewRenderer, IEmailParser emailParser, IOptions options, ILogger logger) + public EmailService( + IEmailViewRender emailViewRenderer, + IEmailParser emailParser, + IOptions options, + ILogger logger + ) { this.emailViewRenderer = emailViewRenderer; this.emailParser = emailParser; diff --git a/src/Postal.AspNetCore/EmailViewRender.cs b/src/Postal.AspNetCore/EmailViewRender.cs index db22d9e..7789b05 100644 --- a/src/Postal.AspNetCore/EmailViewRender.cs +++ b/src/Postal.AspNetCore/EmailViewRender.cs @@ -50,17 +50,8 @@ public virtual Task RenderAsync(Email email) public virtual async Task RenderAsync(Email email, string viewName = null) { viewName = viewName ?? email.ViewName; - //var controllerContext = CreateControllerContext(email.AreaName, url); - //var view = CreateView(viewName, controllerContext); var routeData = new Microsoft.AspNetCore.Routing.RouteData(); - if (email.Routers != null && email.Routers.Count > 0) - { - foreach (var r in email.Routers) - { - routeData.Routers.Add(r); - } - } routeData.Values["controller"] = EmailViewDirectoryName; routeData.Values["page"] = EmailViewDirectoryName; if (!string.IsNullOrWhiteSpace(email.AreaName)) @@ -71,7 +62,7 @@ public virtual async Task RenderAsync(Email email, string viewName = nul Dictionary viewData = new Dictionary(); viewData[ImageEmbedder.ViewDataKey] = email.ImageEmbedder; - var viewOutput = await _templateService.RenderTemplateAsync(routeData, viewName, email, viewData, true); + var viewOutput = await _templateService.RenderTemplateAsync(email.HttpContextData, routeData, viewName, email, viewData, true); viewData.Remove(ImageEmbedder.ViewDataKey); return viewOutput; } diff --git a/src/Postal.AspNetCore/HttpContextData.cs b/src/Postal.AspNetCore/HttpContextData.cs new file mode 100644 index 0000000..61e2aa4 --- /dev/null +++ b/src/Postal.AspNetCore/HttpContextData.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Postal.AspNetCore +{ + public class HttpContextData + { + public Endpoint Endpoint { get; internal set; } + public RouteValueDictionary RouteValues { get; internal set; } + } +} diff --git a/src/Postal.AspNetCore/InternalClass/EndpointFeature.cs b/src/Postal.AspNetCore/InternalClass/EndpointFeature.cs new file mode 100644 index 0000000..f2740a5 --- /dev/null +++ b/src/Postal.AspNetCore/InternalClass/EndpointFeature.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Postal.AspNetCore.InternalClass +{ + internal sealed class EndpointFeature : IEndpointFeature + { + public Endpoint Endpoint { get; set; } + + public EndpointFeature(Endpoint endpoint) + { + Endpoint = endpoint; + } + } +} diff --git a/src/Postal.AspNetCore/TemplateServices/ITemplateService.cs b/src/Postal.AspNetCore/TemplateServices/ITemplateService.cs index 38f8d04..142ea29 100644 --- a/src/Postal.AspNetCore/TemplateServices/ITemplateService.cs +++ b/src/Postal.AspNetCore/TemplateServices/ITemplateService.cs @@ -17,7 +17,7 @@ public interface ITemplateService /// Filename of the template to render /// View model to use for rendering the template /// Returns the rendered template content - Task RenderTemplateAsync(RouteData routeData, string viewName, TViewModel viewModel, + Task RenderTemplateAsync(HttpContextData HttpContextData, RouteData routeData, string viewName, TViewModel viewModel, Dictionary additonalViewDictionary = null, bool isMainPage = true) where TViewModel : IViewData; } } \ No newline at end of file diff --git a/src/Postal.AspNetCore/TemplateServices/TemplateService.cs b/src/Postal.AspNetCore/TemplateServices/TemplateService.cs index f3b3c8f..08cd208 100644 --- a/src/Postal.AspNetCore/TemplateServices/TemplateService.cs +++ b/src/Postal.AspNetCore/TemplateServices/TemplateService.cs @@ -1,4 +1,6 @@ +using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Razor; @@ -7,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; +using Postal.AspNetCore.InternalClass; using System; using System.Collections.Generic; using System.Diagnostics; @@ -50,13 +53,16 @@ DiagnosticListener diagnosticListener _diagnosticListener = diagnosticListener; } - public async Task RenderTemplateAsync(RouteData routeData, + public async Task RenderTemplateAsync(HttpContextData httpContextData, RouteData routeData, string viewName, TViewModel viewModel, Dictionary additonalViewDictionary = null, bool isMainPage = true) where TViewModel : IViewData { - var httpContext = new DefaultHttpContext + var httpContext = new DefaultHttpContext() { - RequestServices = _serviceProvider + RequestServices = _serviceProvider, }; + httpContext.Features.Set(new EndpointFeature(httpContextData.Endpoint)); + httpContext.Features.Set(new RouteValuesFeature() { RouteValues = httpContextData.RouteValues }); + if (viewModel.RequestPath != null) { httpContext.Request.Host = HostString.FromUriComponent(viewModel.RequestPath.Host); @@ -135,6 +141,7 @@ DiagnosticListener diagnosticListener { if (viewResult.Success) { + _logger.LogDebug($"View template found: {viewResult.View.Path}"); var viewContext = new ViewContext(actionContext, viewResult.View, viewDictionary, tempDataDictionary, outputWriter, new HtmlHelperOptions()); @@ -142,6 +149,7 @@ DiagnosticListener diagnosticListener } else if (razorPageResult?.Page != null) { + _logger.LogDebug($"Razor page found: {razorPageResult?.Page.Path}"); var page = razorPageResult?.Page; var razorView = new RazorView( _viewEngine,