diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs similarity index 99% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs index fc428d9f31..a94401a3a4 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.CmsKit.EntityFrameworkCore; namespace Volo.CmsKit.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20220504032430_Initial")] + [Migration("20220808112328_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -21,7 +21,7 @@ namespace Volo.CmsKit.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("ProductVersion", "6.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); @@ -1662,6 +1662,9 @@ namespace Volo.CmsKit.Migrations .HasDefaultValue(false) .HasColumnName("IsDeleted"); + b.Property("IsHomePage") + .HasColumnType("bit"); + b.Property("LastModificationTime") .HasColumnType("datetime2") .HasColumnName("LastModificationTime"); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs similarity index 99% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs index e48811ee84..5f499c30a9 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs @@ -433,6 +433,7 @@ namespace Volo.CmsKit.Migrations Content = table.Column(type: "nvarchar(max)", maxLength: 2147483647, nullable: true), Script = table.Column(type: "nvarchar(max)", nullable: true), Style = table.Column(type: "nvarchar(max)", nullable: true), + IsHomePage = table.Column(type: "bit", nullable: false), ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), CreationTime = table.Column(type: "datetime2", nullable: false), diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 2a5d13e732..4205bd31c3 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace Volo.CmsKit.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("ProductVersion", "6.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); @@ -1660,6 +1660,9 @@ namespace Volo.CmsKit.Migrations .HasDefaultValue(false) .HasColumnName("IsDeleted"); + b.Property("IsHomePage") + .HasColumnType("bit"); + b.Property("LastModificationTime") .HasColumnType("datetime2") .HasColumnName("LastModificationTime"); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs index ec7cb919f9..e0d901bdd5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs @@ -1,11 +1,10 @@ using System; using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; -using Volo.Abp.Content; namespace Volo.CmsKit.Admin.Pages; public interface IPageAdminAppService : ICrudAppService { + Task SetAsHomePageAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs index 20a76bf43e..f8348302d2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs @@ -17,5 +17,7 @@ public class PageDto : AuditedEntityDto, IHasConcurrencyStamp public string Style { get; set; } + public bool IsHomePage { get; set; } + public string ConcurrencyStamp { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs index b89b38d43a..7ba4cc2d84 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs @@ -35,6 +35,8 @@ public class CmsKitAdminPermissionDefinitionProvider : PermissionDefinitionProvi .RequireGlobalFeatures(typeof(PagesFeature)); pageManagement.AddChild(CmsKitAdminPermissions.Pages.Delete, L("Permission:PageManagement:Delete")) .RequireGlobalFeatures(typeof(PagesFeature)); + pageManagement.AddChild(CmsKitAdminPermissions.Pages.SetAsHomePage, L("Permission:PageManagement:SetAsHomePage")) + .RequireGlobalFeatures(typeof(PagesFeature)); var blogManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Blogs.Default, L("Permission:BlogManagement")) .RequireGlobalFeatures(typeof(BlogsFeature)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs index b5d2a8eaa6..2852a0b4ee 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs @@ -1,8 +1,6 @@ -using Volo.Abp.Reflection; +namespace Volo.CmsKit.Permissions; -namespace Volo.CmsKit.Permissions; - -public class CmsKitAdminPermissions +public static class CmsKitAdminPermissions { public const string GroupName = "CmsKit"; @@ -34,6 +32,7 @@ public class CmsKitAdminPermissions public const string Create = Default + ".Create"; public const string Update = Default + ".Update"; public const string Delete = Default + ".Delete"; + public const string SetAsHomePage = Default + ".SetAsHomePage"; } public static class Blogs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index 647568e561..2b1cd10b89 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -86,4 +86,14 @@ public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppServi { await PageRepository.DeleteAsync(id); } + + [Authorize(CmsKitAdminPermissions.Pages.SetAsHomePage)] + public virtual async Task SetAsHomePageAsync(Guid id) + { + var page = await PageRepository.GetAsync(id); + + await PageManager.SetHomePageAsync(page); + + await PageRepository.UpdateAsync(page); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs index 5d404b2751..efa0315690 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs @@ -55,4 +55,12 @@ public partial class PageAdminClientProxy : ClientProxyBase" + }, + "SetAsHomePageAsyncById": { + "uniqueName": "SetAsHomePageAsyncById", + "name": "SetAsHomePageAsync", + "httpMethod": "PUT", + "url": "api/cms-kit-admin/pages/setashomepage/{id}", + "supportedVersions": [], + "parametersOnMethod": [ + { + "name": "id", + "typeAsString": "System.Guid, System.Private.CoreLib", + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "id", + "name": "id", + "jsonName": null, + "type": "System.Guid", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": [], + "bindingSourceId": "Path", + "descriptorName": "" + } + ], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": false, + "implementFrom": "Volo.CmsKit.Admin.Pages.IPageAdminAppService" } } }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs index 5acccb07aa..26a11c19fb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs @@ -62,4 +62,12 @@ public class PageAdminController : CmsKitAdminController, IPageAdminAppService { return PageAdminAppService.DeleteAsync(id); } + + [HttpPut] + [Authorize(CmsKitAdminPermissions.Pages.SetAsHomePage)] + [Route("setashomepage/{id}")] + public virtual Task SetAsHomePageAsync([FromRoute] Guid id) + { + return PageAdminAppService.SetAsHomePageAsync(id); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs index be4d85ddcc..4c886b9185 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs @@ -1,19 +1,19 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc; -using Volo.CmsKit.Admin.Web.Menus; using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; +using Volo.Abp.AutoMapper; +using Volo.Abp.Http.ProxyScripting.Generators.JQuery; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; +using Volo.CmsKit.Admin.MediaDescriptors; +using Volo.CmsKit.Admin.Web.Menus; using Volo.CmsKit.Localization; -using Volo.CmsKit.Web; using Volo.CmsKit.Permissions; -using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; -using Volo.Abp.Localization; -using Volo.Abp.AutoMapper; -using Volo.Abp.Http.ProxyScripting.Generators.JQuery; -using Volo.CmsKit.Admin.MediaDescriptors; +using Volo.CmsKit.Web; namespace Volo.CmsKit.Admin.Web; @@ -64,6 +64,7 @@ public class CmsKitAdminWebModule : AbpModule options.Conventions.AuthorizeFolder("/CmsKit/Pages", CmsKitAdminPermissions.Pages.Default); options.Conventions.AuthorizeFolder("/CmsKit/Pages/Create", CmsKitAdminPermissions.Pages.Create); options.Conventions.AuthorizeFolder("/CmsKit/Pages/Update", CmsKitAdminPermissions.Pages.Update); + options.Conventions.AuthorizeFolder("/CmsKit/Pages/SetAsHomePage", CmsKitAdminPermissions.Pages.SetAsHomePage); options.Conventions.AuthorizeFolder("/CmsKit/Blogs", CmsKitAdminPermissions.Blogs.Default); options.Conventions.AuthorizeFolder("/CmsKit/Blogs/Create", CmsKitAdminPermissions.Blogs.Create); options.Conventions.AuthorizeFolder("/CmsKit/Blogs/Update", CmsKitAdminPermissions.Blogs.Update); @@ -98,7 +99,7 @@ public class CmsKitAdminWebModule : AbpModule Configure(options => { - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -110,7 +111,7 @@ public class CmsKitAdminWebModule : AbpModule } ); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -121,7 +122,7 @@ public class CmsKitAdminWebModule : AbpModule ); }); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -133,7 +134,7 @@ public class CmsKitAdminWebModule : AbpModule ); }); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( @@ -145,7 +146,7 @@ public class CmsKitAdminWebModule : AbpModule ); }); - options.Configure( + options.Configure( toolbar => { toolbar.AddButton( diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js index 3a8612072c..730c9b6b30 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js @@ -1,4 +1,4 @@ -$(function (){ +$(function () { var l = abp.localization.getResource("CmsKit"); var pagesService = volo.cmsKit.admin.pages.pageAdmin; @@ -17,7 +17,7 @@ $(function (){ scrollCollapse: true, scrollX: true, ordering: true, - order: [[3, "desc"]], + order: [[4, "desc"]], ajax: abp.libs.datatables.createAjax(pagesService.getList, getFilter), columnDefs: [ { @@ -46,6 +46,21 @@ $(function (){ abp.notify.success(l('SuccessfullyDeleted')); }); } + }, + { + text: l('SetAsHomePage'), + visible: abp.auth.isGranted('CmsKit.Pages.SetAsHomePage'), + action: function (data) { + pagesService + .setAsHomePage(data.record.id) + .then(function () { + + _dataTable.ajax.reload(); + data.record.isHomePage ? + abp.notify.warn(l('RemovedSettingAsHomePage')) + : abp.notify.success(l('CompletedSettingAsHomePage')); + }); + } } ] } @@ -60,6 +75,11 @@ $(function (){ orderable: true, data: "slug" }, + { + title: l("IsHomePage"), + orderable: true, + data: "isHomePage" + }, { title: l("CreationTime"), orderable: true, diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js index 3a61ef6a78..3198bb3e3e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js @@ -136,6 +136,14 @@ }, ajaxParams)); }; + volo.cmsKit.admin.pages.pageAdmin.setAsHomePage = function(id, ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-admin/pages/setashomepage/' + id + '', + type: 'PUT', + dataType: null + }, ajaxParams)); + }; + })(); // controller volo.cmsKit.admin.menus.menuItemAdmin diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs index 773ca621a2..16e070769b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs @@ -11,7 +11,8 @@ public static class CmsKitErrorCodes public static class Pages { public const string SlugAlreadyExist = "CmsKit:Page:0001"; - } + public const string MultipleHomePage = "CmsKit:Page:0002"; + } public static class Ratings { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 0faaf04e81..b6fb5f5aea 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -112,6 +112,7 @@ "Permission:PageManagement:Create": "Create", "Permission:PageManagement:Delete": "Delete", "Permission:PageManagement:Update": "Update", + "Permission:PageManagement:SetAsHomePage": "Set As Home Page", "Permission:TagManagement": "Tag Management", "Permission:TagManagement.Create": "Create", "Permission:TagManagement.Delete": "Delete", @@ -188,6 +189,10 @@ "SelectAnAuthor": "Select an Author", "InThisDocument": "In This Document", "GoToTop": "Go To Top", + "SetAsHomePage": "Change Home Page Status", + "CompletedSettingAsHomePage": "Set as home page", + "IsHomePage": "Is Home Page", + "RemovedSettingAsHomePage": "Removed setting the home page", "Feature:CmsKitGroup": "Cms Kit", "Feature:BlogEnable": "Enabled blog page", "Feature:BlogEnableDescription": "Enable blog page in the application.", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index 6b47d5ad47..e143332425 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -112,6 +112,7 @@ "Permission:PageManagement:Create": "Oluşturmak", "Permission:PageManagement:Delete": "Silmek", "Permission:PageManagement:Update": "Güncelleme", + "Permission:PageManagement:SetAsHomePage": "Anasayfa Olarak Ayarla", "Permission:TagManagement": "Etiket Yönetimi", "Permission:TagManagement.Create": "Etiket Oluşturma", "Permission:TagManagement.Delete": "Etiket Silme", @@ -161,8 +162,6 @@ "YourReply": "Cevabınız", "MarkdownSupported": "Markdown destekler.", "GlobalResources": "Global Kaynaklar", - "Script": "Script", - "Style": "Style", "SavedSuccessfully": "Başarıyla kaydedildi", "CmsKit.BlogPost.Status.0": "Taslak", "CmsKit.BlogPost.Status.1": "Yayınlandı", @@ -189,6 +188,10 @@ "Add": "Ekle", "AddWidget": "Widget Ekle", "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", + "SetAsHomePage": "Ana sayfa Durumunu Değiştir", + "CompletedSettingAsHomePage": "Ana Sayfa olarak ayarlandı", + "IsHomePage": "Ana Sayfa Mı", + "RemovedSettingAsHomePage": "Ana sayfa ayarı kaldırıldı", "Permission:GlobalResources": "Global Kaynaklar", "Feature:CmsKitGroup": "Cms Kit", "Feature:BlogEnable": "Blog sayfasını etkinleştirin", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs index 020622f080..0b75c32d6b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs @@ -22,4 +22,6 @@ public interface IPageRepository : IBasicRepository Task FindBySlugAsync(string slug, CancellationToken cancellationToken = default); Task ExistsAsync(string slug, CancellationToken cancellationToken = default); + + Task> GetListOfHomePagesAsync(CancellationToken cancellationToken = default); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/MultipleHomePageException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/MultipleHomePageException.cs new file mode 100644 index 0000000000..1cf4028e39 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/MultipleHomePageException.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; + +namespace Volo.CmsKit.Domain.Volo.CmsKit.Pages; + +[Serializable] +public class MultipleHomePageException : BusinessException +{ + public MultipleHomePageException() + { + Code = CmsKitErrorCodes.Pages.MultipleHomePage; + } + + public MultipleHomePageException(SerializationInfo serializationInfo, StreamingContext context) + : base(serializationInfo, context) + { + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs index d5cd64fbed..449b07091b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs @@ -20,6 +20,8 @@ public class Page : FullAuditedAggregateRoot, IMultiTenant public virtual string Style { get; protected set; } + public virtual bool IsHomePage { get; protected set; } + protected Page() { } @@ -49,9 +51,7 @@ public class Page : FullAuditedAggregateRoot, IMultiTenant internal virtual void SetSlug(string slug) { - Slug = SlugNormalizer.Normalize( - Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength) - ); + Slug = SlugNormalizer.Normalize(Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength)); } public virtual void SetContent(string content) @@ -68,4 +68,9 @@ public class Page : FullAuditedAggregateRoot, IMultiTenant { Style = Check.Length(style, nameof(style), PageConsts.MaxStyleLength); } + + internal void SetIsHomePage(bool isHomePage) + { + IsHomePage = isHomePage; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs index f0d1bac1e7..a2cd7a3378 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs @@ -1,9 +1,6 @@ -using JetBrains.Annotations; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp; using Volo.Abp.Domain.Services; @@ -11,49 +8,75 @@ namespace Volo.CmsKit.Pages; public class PageManager : DomainService { - protected IPageRepository PageRepository { get; } - - public PageManager(IPageRepository pageRepository) - { - PageRepository = pageRepository; - } - - public virtual async Task CreateAsync( - [NotNull] string title, - [NotNull] string slug, - [CanBeNull] string content = null, - [CanBeNull] string script = null, - [CanBeNull] string style = null) - { - Check.NotNullOrEmpty(title, nameof(title)); - Check.NotNullOrEmpty(slug, nameof(slug)); - - await CheckPageSlugAsync(slug); - - return new Page( - GuidGenerator.Create(), - title, - slug, - content, - script, - style, - CurrentTenant.Id); - } - - public virtual async Task SetSlugAsync(Page page, string newSlug) - { - if (page.Slug != newSlug) - { - await CheckPageSlugAsync(newSlug); - page.SetSlug(newSlug); - } - } - - protected virtual async Task CheckPageSlugAsync(string slug) - { - if (await PageRepository.ExistsAsync(slug)) - { - throw new PageSlugAlreadyExistsException(slug); - } - } + protected IPageRepository PageRepository { get; } + + public PageManager(IPageRepository pageRepository) + { + PageRepository = pageRepository; + } + + public virtual async Task CreateAsync( + [NotNull] string title, + [NotNull] string slug, + [CanBeNull] string content = null, + [CanBeNull] string script = null, + [CanBeNull] string style = null) + { + Check.NotNullOrEmpty(title, nameof(title)); + Check.NotNullOrEmpty(slug, nameof(slug)); + + await CheckPageSlugAsync(slug); + + return new Page( + GuidGenerator.Create(), + title, + slug, + content, + script, + style, + CurrentTenant.Id); + } + + public virtual async Task SetSlugAsync(Page page, string newSlug) + { + if (page.Slug != newSlug) + { + await CheckPageSlugAsync(newSlug); + page.SetSlug(newSlug); + } + } + + public virtual async Task SetHomePageAsync(Page page) + { + var currentHomePages = await PageRepository.GetListAsync(); + + foreach (var homePage in currentHomePages) + { + homePage.SetIsHomePage(false); + } + + await PageRepository.UpdateManyAsync(currentHomePages); + + page.SetIsHomePage(true); + } + + public virtual async Task GetHomePageAsync() + { + var currentHomePages = await PageRepository.GetListAsync(); + + if (currentHomePages.Count > 1) + { + throw new BusinessException("There can be only one home page."); + } + + return currentHomePages.FirstOrDefault(); + } + + protected virtual async Task CheckPageSlugAsync(string slug) + { + if (await PageRepository.ExistsAsync(slug)) + { + throw new PageSlugAlreadyExistsException(slug); + } + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs index 125c1a97ff..aefd834013 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs @@ -63,4 +63,9 @@ public class EfCorePageRepository : EfCoreRepository x.Slug == slug, GetCancellationToken(cancellationToken)); } + + public virtual Task> GetListOfHomePagesAsync(CancellationToken cancellationToken = default) + { + return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs index 74c5d8cc3c..d398e7de64 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs @@ -71,4 +71,9 @@ public class MongoPageRepository : MongoDbRepository x.Slug == slug, GetCancellationToken(cancellationToken)); } + + public virtual Task> GetListOfHomePagesAsync(CancellationToken cancellationToken = default) + { + return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs index 230b8ded97..bec4261f19 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs @@ -8,4 +8,5 @@ namespace Volo.CmsKit.Public.Pages; public interface IPagePublicAppService : IApplicationService { Task FindBySlugAsync([NotNull] string slug); + Task FindDefaultHomePageAsync(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs index c93adcd5a7..b151775d8a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs @@ -1,4 +1,7 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Volo.Abp.Caching; using Volo.Abp.Features; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Contents; @@ -13,10 +16,15 @@ namespace Volo.CmsKit.Public.Pages; public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppService { protected IPageRepository PageRepository { get; } + protected PageManager PageManager { get; } - public PagePublicAppService(IPageRepository pageRepository) + protected IDistributedCache PageCache { get; } + + public PagePublicAppService(IPageRepository pageRepository, PageManager pageManager, IDistributedCache pageCache) { PageRepository = pageRepository; + PageManager = pageManager; + PageCache = pageCache; } public virtual async Task FindBySlugAsync(string slug) @@ -30,4 +38,24 @@ public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppSe return ObjectMapper.Map(page); } + + public virtual async Task FindDefaultHomePageAsync() + { + var pageDto = await PageCache.GetAsync("DefaultHomePage"); + if (pageDto is null) + { + var page = await PageManager.GetHomePageAsync(); + if (page is null) + { + return null; + } + + pageDto = ObjectMapper.Map(page); + + await PageCache.SetAsync("DefaultHomePage", pageDto, + new DistributedCacheEntryOptions { AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) }); + } + + return pageDto; + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs index f26816e88d..79b883aa49 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs @@ -2,8 +2,11 @@ using System; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; +using Volo.CmsKit.Public.Blogs; using Volo.CmsKit.Contents; using Volo.CmsKit.Users; diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs index f992bb3dbf..2ae4e790a6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs @@ -1,7 +1,12 @@ // This file is automatically generated by ABP framework to use MVC Controllers from CSharp +using System; using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Modeling; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Client.ClientProxying; +using Volo.CmsKit.Public.Pages; using Volo.CmsKit.Contents; // ReSharper disable once CheckNamespace @@ -18,4 +23,9 @@ public partial class PagesPublicClientProxy : ClientProxyBase FindDefaultHomePageAsync() + { + return await RequestAsync(nameof(FindDefaultHomePageAsync)); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json index e3b3802ee9..2892c636e3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json @@ -553,6 +553,21 @@ }, "allowAnonymous": null, "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" + }, + "FindDefaultHomePageAsync": { + "uniqueName": "FindDefaultHomePageAsync", + "name": "FindDefaultHomePageAsync", + "httpMethod": "GET", + "url": "api/cms-kit-public/pages", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "Volo.CmsKit.Contents.PageDto", + "typeSimple": "Volo.CmsKit.Contents.PageDto" + }, + "allowAnonymous": null, + "implementFrom": "Volo.CmsKit.Public.Pages.IPagePublicAppService" } } }, diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs index 22f2bd75bd..d6550977ef 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs @@ -29,4 +29,10 @@ public class PagesPublicController : CmsKitPublicControllerBase, IPagePublicAppS { return PageAppService.FindBySlugAsync(slug); } + + [HttpGet] + public Task FindDefaultHomePageAsync() + { + return PageAppService.FindDefaultHomePageAsync(); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 3ce96f1a86..ba99fc5a7a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -1,9 +1,11 @@ using Markdig; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.Ui.LayoutHooks; using Volo.Abp.AutoMapper; +using Volo.Abp.Caching; using Volo.Abp.GlobalFeatures; using Volo.Abp.Http.ProxyScripting.Generators.JQuery; using Volo.Abp.Modularity; @@ -75,6 +77,11 @@ public class CmsKitPublicWebModule : AbpModule { options.DisableModule(CmsKitPublicRemoteServiceConsts.ModuleName); }); + + Configure(options => + { + options.KeyPrefix = "CmsKit:"; + }); } public override void PostConfigureServices(ServiceConfigurationContext context) @@ -88,21 +95,27 @@ public class CmsKitPublicWebModule : AbpModule options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/BlogPost", @"/blogs/{blogSlug}/{blogPostSlug:minlength(1)}"); }); } - + if (GlobalFeatureManager.Instance.IsEnabled()) { Configure(options => { options.Add( - LayoutHooks.Head.Last, - typeof(GlobalStyleViewComponent) + LayoutHooks.Head.Last, + typeof(GlobalStyleViewComponent) ); options.Add( - LayoutHooks.Body.Last, - typeof(GlobalScriptViewComponent) + LayoutHooks.Body.Last, + typeof(GlobalScriptViewComponent) ); }); } } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + app.UseHomePageDefaultMiddleware(); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs new file mode 100644 index 0000000000..bb30a5276c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Volo.CmsKit.Pages; +using Volo.CmsKit.Public.Pages; + +namespace Volo.CmsKit.Public.Web; + +public class DefaultHomePageMiddleware +{ + private readonly RequestDelegate _next; + private readonly IPagePublicAppService _pagePublicAppService; + + public DefaultHomePageMiddleware(RequestDelegate next, IPagePublicAppService pagePublicAppService) + { + _next = next; + _pagePublicAppService = pagePublicAppService; + } + public async Task InvokeAsync(HttpContext httpContext) + { + var page = await _pagePublicAppService.FindDefaultHomePageAsync(); + if (page is not null && httpContext.Request.Path.Value == "/") + { + httpContext.Request.Path = $"{PageConsts.UrlPrefix}{page.Slug}"; + } + + await _next(httpContext); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs new file mode 100644 index 0000000000..c5a2d8516f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Builder; + +namespace Volo.CmsKit.Public.Web; + +public static class HomePageDefaultMiddlewareExtensions +{ + public static IApplicationBuilder UseHomePageDefaultMiddleware(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js index e1cdae5ec3..ec98417af5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js @@ -95,6 +95,13 @@ }, ajaxParams)); }; + volo.cmsKit.public.pages.pagesPublic.findDefaultHomePage = function(ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/cms-kit-public/pages', + type: 'GET' + }, ajaxParams)); + }; + })(); // controller volo.cmsKit.public.menus.menuItemPublic @@ -188,7 +195,7 @@ volo.cmsKit.public.blogs.blogPostPublic.getList = function(blogSlug, input, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/cms-kit-public/blog-posts/' + blogSlug + '' + abp.utils.buildQueryString([{ name: 'authorId', value: input.authorId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', + url: abp.appPath + 'api/cms-kit-public/blog-posts/' + blogSlug + '' + abp.utils.buildQueryString([{ name: 'authorId', value: input.authorId }, { name: 'tagId', value: input.tagId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '', type: 'GET' }, ajaxParams)); }; diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs index 97a931fb70..86346da843 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs @@ -130,4 +130,17 @@ public class PageAdminAppService_Tests : CmsKitApplicationTestBase await Should.ThrowAsync(async () => await _pageRepository.GetAsync(_data.Page_1_Id)); } + + [Fact] + public async Task ShouldSetAsHomePageAsync() + { + await _pageAdminAppService.SetAsHomePageAsync(_data.Page_1_Id); + + var setAsHomePage = await _pageAdminAppService.GetAsync(_data.Page_1_Id); + var setAsHomePageAsFalse = await _pageAdminAppService.GetAsync(_data.Page_2_Id); + + setAsHomePage.IsHomePage.ShouldBeTrue(); + setAsHomePageAsFalse.IsHomePage.ShouldBeFalse(); + + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs index 208de3817f..71d02b1a0f 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs @@ -1,70 +1,111 @@ using System.Threading.Tasks; using Shouldly; +using Volo.CmsKit.Tags; using Xunit; namespace Volo.CmsKit.Pages; public class PageManager_Test : CmsKitDomainTestBase { - private readonly PageManager pageManager; - private readonly CmsKitTestData testData; - private readonly IPageRepository pageRepository; - - public PageManager_Test() - { - pageManager = GetRequiredService(); - testData = GetRequiredService(); - pageRepository = GetRequiredService(); - } - - [Fact] - public async Task CreateAsync_ShouldWorkProperly_WithNonExistingSlug() - { - var title = "My awesome page"; - var slug = "my-awesome-page"; - var content = "

My Awesome Page

This is my awesome page content!

"; - - var page = await pageManager.CreateAsync(title, slug, content); - - page.ShouldNotBeNull(); - page.Title.ShouldBe(title); - page.Slug.ShouldBe(slug); - page.Content.ShouldBe(content); - } - - [Fact] - public async Task CreateAsync_ShouldThrowException_WithExistingSlug() - { - var title = "My awesome page"; - var slug = testData.Page_1_Slug; - var content = "

My Awesome Page

This is my awesome page content!

"; - - var exception = await Should.ThrowAsync(async () => - await pageManager.CreateAsync(title, slug, content)); - - exception.ShouldNotBeNull(); - } - - [Fact] - public async Task SetSlugAsync_ShouldWorkProperly_WithNonExistingSlug() - { - var newSlug = "freshly-generated-new-slug"; - var page = await pageRepository.GetAsync(testData.Page_1_Id); - - await pageManager.SetSlugAsync(page, newSlug); - - page.Slug.ShouldBe(newSlug); - } - - [Fact] - public async Task SetSlugAsync_ShouldThrowException_WithExistingSlug() - { - var newSlug = testData.Page_2_Slug; - var page = await pageRepository.GetAsync(testData.Page_1_Id); - - var exception = await Should.ThrowAsync(async () => - await pageManager.SetSlugAsync(page, newSlug)); - - exception.ShouldNotBeNull(); - } + private readonly PageManager pageManager; + private readonly CmsKitTestData testData; + private readonly IPageRepository pageRepository; + + public PageManager_Test() + { + pageManager = GetRequiredService(); + testData = GetRequiredService(); + pageRepository = GetRequiredService(); + } + + [Fact] + public async Task CreateAsync_ShouldWorkProperly_WithNonExistingSlug() + { + var title = "My awesome page"; + var slug = "my-awesome-page"; + var content = "

My Awesome Page

This is my awesome page content!

"; + + var page = await pageManager.CreateAsync(title, slug, content); + + page.ShouldNotBeNull(); + page.Title.ShouldBe(title); + page.Slug.ShouldBe(slug); + page.Content.ShouldBe(content); + } + + [Fact] + public async Task CreateAsync_ShouldThrowException_WithExistingSlug() + { + var title = "My awesome page"; + var slug = testData.Page_1_Slug; + var content = "

My Awesome Page

This is my awesome page content!

"; + + var exception = await Should.ThrowAsync(async () => + await pageManager.CreateAsync(title, slug, content)); + + exception.ShouldNotBeNull(); + } + + [Fact] + public async Task SetSlugAsync_ShouldWorkProperly_WithNonExistingSlug() + { + var newSlug = "freshly-generated-new-slug"; + var page = await pageRepository.GetAsync(testData.Page_1_Id); + + await pageManager.SetSlugAsync(page, newSlug); + + page.Slug.ShouldBe(newSlug); + } + + [Fact] + public async Task SetSlugAsync_ShouldThrowException_WithExistingSlug() + { + var newSlug = testData.Page_2_Slug; + var page = await pageRepository.GetAsync(testData.Page_1_Id); + + var exception = await Should.ThrowAsync(async () => + await pageManager.SetSlugAsync(page, newSlug)); + + exception.ShouldNotBeNull(); + } + + [Fact] + public async Task SetHomePageAsync_ShouldWorkProperly_IfExistHomePage() + { + var page = await pageRepository.GetAsync(testData.Page_1_Id); + + await pageManager.SetHomePageAsync(page); + + await pageRepository.UpdateAsync(page); + + page.IsHomePage.ShouldBeTrue(); + + var pageSetAsHomePageAsFalse = await pageRepository.GetAsync(testData.Page_2_Id); + pageSetAsHomePageAsFalse.IsHomePage.ShouldBeFalse(); + } + + [Fact] + public async Task SetHomePageAsync_ShouldFix_WhenMultipleHomePageExist() + { + await WithUnitOfWorkAsync(async () => + { + var page1 = await pageRepository.GetAsync(testData.Page_1_Id); + var page2 = await pageRepository.GetAsync(testData.Page_2_Id); + + page1.SetIsHomePage(true); + page2.SetIsHomePage(true); + + await pageRepository.UpdateManyAsync(new[] { page1, page2 }, autoSave: true); + + await pageManager.SetHomePageAsync(page1); + }); + + var page1 = await pageRepository.GetAsync(testData.Page_1_Id); + var page2 = await pageRepository.GetAsync(testData.Page_2_Id); + + page2 = await pageRepository.GetAsync(testData.Page_2_Id); + + page1.IsHomePage.ShouldBeTrue(); + page2.IsHomePage.ShouldBeFalse(); + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs index 4b56f77f43..dcdcef5ad3 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs @@ -7,88 +7,96 @@ using Xunit; namespace Volo.CmsKit.Pages; public abstract class PageRepository_Test : CmsKitTestBase - where TStartupModule : IAbpModule + where TStartupModule : IAbpModule { - private readonly CmsKitTestData _cmsKitTestData; - private readonly IPageRepository _pageRepository; + private readonly CmsKitTestData _cmsKitTestData; + private readonly IPageRepository _pageRepository; - protected PageRepository_Test() - { - _cmsKitTestData = GetRequiredService(); - _pageRepository = GetRequiredService(); - } + protected PageRepository_Test() + { + _cmsKitTestData = GetRequiredService(); + _pageRepository = GetRequiredService(); + } - [Fact] - public async Task CountAsync() - { - var totalCount = await _pageRepository.GetCountAsync(); + [Fact] + public async Task CountAsync() + { + var totalCount = await _pageRepository.GetCountAsync(); - totalCount.ShouldBe(2); + totalCount.ShouldBe(2); - var filteredCount = await _pageRepository.GetCountAsync(_cmsKitTestData.Page_2_Title); + var filteredCount = await _pageRepository.GetCountAsync(_cmsKitTestData.Page_2_Title); - filteredCount.ShouldBe(1); - } + filteredCount.ShouldBe(1); + } - [Fact] - public async Task GetListAsync() - { - var list = await _pageRepository.GetListAsync(); + [Fact] + public async Task GetListAsync() + { + var list = await _pageRepository.GetListAsync(); - list.ShouldNotBeNull(); - list.Count.ShouldBe(2); + list.ShouldNotBeNull(); + list.Count.ShouldBe(2); - var list_page_1 = await _pageRepository.GetListAsync(maxResultCount: 1); - var list_page_2 = await _pageRepository.GetListAsync(maxResultCount: 1, skipCount: 1); + var list_page_1 = await _pageRepository.GetListAsync(maxResultCount: 1); + var list_page_2 = await _pageRepository.GetListAsync(maxResultCount: 1, skipCount: 1); - list_page_1.ShouldNotBeNull(); - list_page_1.Count.ShouldBe(1); - list_page_1.First().Title.ShouldBe(_cmsKitTestData.Page_1_Title); + list_page_1.ShouldNotBeNull(); + list_page_1.Count.ShouldBe(1); + list_page_1.First().Title.ShouldBe(_cmsKitTestData.Page_1_Title); - list_page_2.ShouldNotBeNull(); - list_page_1.Count.ShouldBe(1); - list_page_2.First().Title.ShouldBe(_cmsKitTestData.Page_2_Title); - } + list_page_2.ShouldNotBeNull(); + list_page_1.Count.ShouldBe(1); + list_page_2.First().Title.ShouldBe(_cmsKitTestData.Page_2_Title); + } - [Fact] - public async Task ShouldGetByUrlAsync() - { - var page = await _pageRepository.GetBySlugAsync(_cmsKitTestData.Page_1_Slug); + [Fact] + public async Task ShouldGetByUrlAsync() + { + var page = await _pageRepository.GetBySlugAsync(_cmsKitTestData.Page_1_Slug); - page.ShouldNotBeNull(); - page.Title.ShouldBe(_cmsKitTestData.Page_1_Title); - } + page.ShouldNotBeNull(); + page.Title.ShouldBe(_cmsKitTestData.Page_1_Title); + } - [Fact] - public async Task ShouldFindByUrlAsync() - { - var page = await _pageRepository.FindBySlugAsync(_cmsKitTestData.Page_1_Slug); + [Fact] + public async Task ShouldFindByUrlAsync() + { + var page = await _pageRepository.FindBySlugAsync(_cmsKitTestData.Page_1_Slug); - page.ShouldNotBeNull(); - page.Title.ShouldBe(_cmsKitTestData.Page_1_Title); - } + page.ShouldNotBeNull(); + page.Title.ShouldBe(_cmsKitTestData.Page_1_Title); + } - [Fact] - public async Task ShouldNotFindByUrlAsync() - { - var page = await _pageRepository.FindBySlugAsync("not-exist-lyrics"); + [Fact] + public async Task ShouldNotFindByUrlAsync() + { + var page = await _pageRepository.FindBySlugAsync("not-exist-lyrics"); - page.ShouldBeNull(); - } + page.ShouldBeNull(); + } - [Fact] - public async Task ShouldBeExistAsync() - { - var page = await _pageRepository.ExistsAsync(_cmsKitTestData.Page_1_Slug); + [Fact] + public async Task ShouldBeExistAsync() + { + var page = await _pageRepository.ExistsAsync(_cmsKitTestData.Page_1_Slug); - page.ShouldBeTrue(); - } + page.ShouldBeTrue(); + } - [Fact] - public async Task ShouldNotBeExistAsync() - { - var page = await _pageRepository.ExistsAsync("not-exist-lyrics"); + [Fact] + public async Task ShouldNotBeExistAsync() + { + var page = await _pageRepository.ExistsAsync("not-exist-lyrics"); - page.ShouldBeFalse(); - } + page.ShouldBeFalse(); + } + + [Fact] + public async Task ShouldntFindByIsHomePageAsync() + { + var pages = await _pageRepository.GetListOfHomePagesAsync(); + + pages.ShouldBeEmpty(); + } }