Convert Page middleware to DynamicRouteValueTransformer

pull/17642/head
Enis Necipoglu 2 years ago
parent 60f6c3bd4f
commit 0cd1dc348c
No known key found for this signature in database
GPG Key ID: 1EC55E13241E1680

@ -41,6 +41,8 @@ using Microsoft.AspNetCore.Mvc.Routing;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Volo.Abp.DependencyInjection;
using Volo.CmsKit.Public.Pages;
#if EntityFrameworkCore
using Volo.Abp.SettingManagement.EntityFrameworkCore;
@ -251,7 +253,6 @@ public class CmsKitWebUnifiedModule : AbpModule
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCmsKitPagesMiddleware();
app.UseRouting();
app.UseAuthentication();
@ -272,7 +273,10 @@ public class CmsKitWebUnifiedModule : AbpModule
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
app.UseConfiguredEndpoints(builder =>
{
builder.MapCmsPageRoute();
});
using (var scope = context.ServiceProvider.CreateScope())
{
@ -284,18 +288,4 @@ public class CmsKitWebUnifiedModule : AbpModule
});
}
}
}
public class CmsKitPageRouteValueTransformer : DynamicRouteValueTransformer, ITransientDependency
{
public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
if (values.TryGetValue("slug", out var slug))
{
values["page"] = "/Pages/Public/CmsKit/Pages/Index";
values["slug"] = slug;
}
return new ValueTask<RouteValueDictionary>(values);
}
}

@ -0,0 +1,39 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Routing;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Public.Web.Pages;
namespace Volo.CmsKit.Public.Web;
public static class CmsKitPagesConfigurationExtensions
{
/// <summary>
/// Maps CMS Kit to the routing.
/// </summary>
/// <param name="builder"></param>
/// <param name="order">The matching order for the dynamic route. Lower is prior.</param>
public static IEndpointRouteBuilder MapCmsPageRoute(this IEndpointRouteBuilder builder, int? order = null)
{
if (!GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
return builder;
}
builder
.MapDynamicPageRoute<CmsKitHomePageRouteValueTransformer>("/", state: null, order: int.MinValue);
if (order is null)
{
builder
.MapDynamicPageRoute<CmsKitPageRouteValueTransformer>("{**slug}");
}
else
{
builder
.MapDynamicPageRoute<CmsKitPageRouteValueTransformer>("{**slug}", state: default, order: order.Value);
}
return builder;
}
}

@ -1,40 +0,0 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
namespace Volo.CmsKit.Public.Web;
public static class CmsKitPagesMiddlewareExtensions
{
private const string UseCmsKitHomePageMiddlewareKey = "UseCmsKitHomePageMiddleware";
[Obsolete("Use UseCmsKitPagesMiddleware instead.")]
public static IApplicationBuilder UseCmsKitHomePageMiddleware(this IApplicationBuilder builder)
{
if (!GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
return builder;
}
builder.Properties[UseCmsKitHomePageMiddlewareKey] = true;
return builder.UseMiddleware<DefaultHomePageMiddleware>();
}
public static IApplicationBuilder UseCmsKitPagesMiddleware(this IApplicationBuilder builder)
{
if (!GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
return builder;
}
if (!builder.Properties.ContainsKey(UseCmsKitHomePageMiddlewareKey))
{
builder.Properties[UseCmsKitHomePageMiddlewareKey] = true;
builder.UseMiddleware<DefaultHomePageMiddleware>();
}
return builder.UseMiddleware<PageRoutingMiddleware>();
}
}

@ -81,8 +81,6 @@ public class CmsKitPublicWebModule : AbpModule
{
Configure<RazorPagesOptions>(options =>
{
/* Keep the '/pages/{slug}' route for a while for backward compatibility. '/{slug}' route convention still works by the PageRoutingMiddleware. */
options.Conventions.AddPageRoute("/Public/CmsKit/Pages/Index", "/pages/{slug:minlength(1)}");
options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/Index", @"/blogs/{blogSlug:minlength(1)}");
options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/BlogPost", @"/blogs/{blogSlug}/{blogPostSlug:minlength(1)}");
});
@ -102,6 +100,5 @@ public class CmsKitPublicWebModule : AbpModule
);
});
}
}
}

@ -1,33 +0,0 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.CmsKit.Features;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Public.Pages;
namespace Volo.CmsKit.Public.Web;
public class DefaultHomePageMiddleware : IMiddleware, ITransientDependency
{
public virtual async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
if (context.Request.Path.Value == "/")
{
var featureChecker = context.RequestServices.GetRequiredService<IFeatureChecker>();
if (await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable))
{
var pagePublicAppService = context.RequestServices.GetRequiredService<IPagePublicAppService>();
var page = await pagePublicAppService.FindDefaultHomePageAsync();
if (page != null)
{
context.Request.Path = $"/pages/{page.Slug}";
}
}
}
await next(context);
}
}

@ -1,39 +0,0 @@
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.CmsKit.Features;
using Volo.CmsKit.Public.Pages;
namespace Volo.CmsKit.Public.Web;
public class PageRoutingMiddleware : IMiddleware, ITransientDependency
{
public virtual async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
await next(context);
if (context.Response.StatusCode == (int)HttpStatusCode.NotFound)
{
var featureChecker = context.RequestServices.GetRequiredService<IFeatureChecker>();
if (!await featureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable))
{
return;
}
var pagePublicAppService = context.RequestServices.GetRequiredService<IPagePublicAppService>();
var slug = context.Request.Path.ToString().TrimStart('/');
var exist = await pagePublicAppService.DoesSlugExistAsync(slug);
if (exist)
{
context.Request.Path = $"/pages/{slug}";
await next(context);
}
}
}
}

@ -0,0 +1,41 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.CmsKit.Features;
using Volo.CmsKit.Public.Pages;
namespace Volo.CmsKit.Public.Web.Pages;
public class CmsKitHomePageRouteValueTransformer : DynamicRouteValueTransformer, ITransientDependency
{
protected IFeatureChecker FeatureChecker { get; }
protected IPagePublicAppService PagePublicAppService { get; }
public CmsKitHomePageRouteValueTransformer(IFeatureChecker featureChecker, IPagePublicAppService pagePublicAppService)
{
FeatureChecker = featureChecker;
PagePublicAppService = pagePublicAppService;
}
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
if (await FeatureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable))
{
var page = await PagePublicAppService.FindDefaultHomePageAsync();
if (page != null)
{
values = new RouteValueDictionary();
values["page"] = "/Public/CmsKit/Pages/Index";
values["slug"] = page.Slug;
}
}
return values;
}
}

@ -0,0 +1,43 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.CmsKit.Features;
using Volo.CmsKit.Public.Pages;
namespace Volo.CmsKit.Public.Web.Pages;
public class CmsKitPageRouteValueTransformer : DynamicRouteValueTransformer, ITransientDependency
{
protected IFeatureChecker FeatureChecker { get; }
protected IPagePublicAppService PagePublicAppService { get; }
public CmsKitPageRouteValueTransformer(IFeatureChecker featureChecker, IPagePublicAppService pagePublicAppService)
{
FeatureChecker = featureChecker;
PagePublicAppService = pagePublicAppService;
}
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
if (values.TryGetValue("slug", out var slugParameter) && slugParameter is not null)
{
if (!await FeatureChecker.IsEnabledAsync(CmsKitFeatures.PageEnable))
{
return values;
}
var slug = slugParameter.ToString().TrimStart('/');
var exist = await PagePublicAppService.DoesSlugExistAsync(slug);
if (exist)
{
values["page"] = "/Public/CmsKit/Pages/Index";
}
}
return values;
}
}

@ -1,4 +1,4 @@
@page
@page "/pages/{**slug}"
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
@using Volo.CmsKit.Contents
@using Volo.CmsKit.Web.Pages.CmsKit.Components.Contents

Loading…
Cancel
Save