Browse Source

Merge pull request #13635 from abpframework/Setting-home-page-13350

Setting home page 13350
pull/14282/head
Enis Necipoglu 4 years ago
committed by GitHub
parent
commit
3eea313ec1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.Designer.cs
  2. 1
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs
  3. 5
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs
  4. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/IPageAdminAppService.cs
  5. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs
  6. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs
  7. 7
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs
  8. 10
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs
  9. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs
  10. 37
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json
  11. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Pages/PageAdminController.cs
  12. 25
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/CmsKitAdminWebModule.cs
  13. 24
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/Pages/index.js
  14. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js
  15. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs
  16. 5
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  17. 7
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json
  18. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs
  19. 23
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/MultipleHomePageException.cs
  20. 11
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs
  21. 123
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs
  22. 5
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs
  23. 5
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs
  24. 1
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Pages/IPagePublicAppService.cs
  25. 32
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Pages/PagePublicAppService.cs
  26. 3
      modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/BlogPostPublicClientProxy.Generated.cs
  27. 10
      modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/PagesPublicClientProxy.Generated.cs
  28. 15
      modules/cms-kit/src/Volo.CmsKit.Public.HttpApi.Client/ClientProxies/cms-kit-generate-proxy.json
  29. 6
      modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Pages/PagesPublicController.cs
  30. 23
      modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs
  31. 28
      modules/cms-kit/src/Volo.CmsKit.Public.Web/DefaultHomePageMiddleware.cs
  32. 11
      modules/cms-kit/src/Volo.CmsKit.Public.Web/HomePageDefaultMiddlewareExtensions.cs
  33. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Web/wwwroot/client-proxies/cms-kit-proxy.js
  34. 13
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs
  35. 163
      modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs
  36. 134
      modules/cms-kit/test/Volo.CmsKit.TestBase/Pages/PageRepository_Test.cs

7
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.Designer.cs → 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<bool>("IsHomePage")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");

1
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220504032430_Initial.cs → modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220808112328_Initial.cs

@ -433,6 +433,7 @@ namespace Volo.CmsKit.Migrations
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 2147483647, nullable: true),
Script = table.Column<string>(type: "nvarchar(max)", nullable: true),
Style = table.Column<string>(type: "nvarchar(max)", nullable: true),
IsHomePage = table.Column<bool>(type: "bit", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),

5
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<bool>("IsHomePage")
.HasColumnType("bit");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");

3
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<PageDto, PageDto, Guid, GetPagesInputDto, CreatePageInputDto, UpdatePageInputDto>
{
Task SetAsHomePageAsync(Guid id);
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/PageDto.cs

@ -17,5 +17,7 @@ public class PageDto : AuditedEntityDto<Guid>, IHasConcurrencyStamp
public string Style { get; set; }
public bool IsHomePage { get; set; }
public string ConcurrencyStamp { get; set; }
}

2
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));

7
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

10
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);
}
}

8
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/PageAdminClientProxy.Generated.cs

@ -55,4 +55,12 @@ public partial class PageAdminClientProxy : ClientProxyBase<IPageAdminAppService
{ typeof(Guid), id }
});
}
public virtual async Task SetAsHomePageAsync(Guid id)
{
await RequestAsync(nameof(SetAsHomePageAsync), new ClientProxyRequestTypeValue
{
{ typeof(Guid), id }
});
}
}

37
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/cms-kit-admin-generate-proxy.json

@ -675,6 +675,43 @@
},
"allowAnonymous": false,
"implementFrom": "Volo.Abp.Application.Services.IDeleteAppService<System.Guid>"
},
"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"
}
}
},

8
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);
}
}

25
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<AbpPageToolbarOptions>(options =>
{
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags.IndexModel>(
options.Configure<Pages.CmsKit.Tags.IndexModel>(
toolbar =>
{
toolbar.AddButton(
@ -110,7 +111,7 @@ public class CmsKitAdminWebModule : AbpModule
}
);
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.Pages.IndexModel>(
options.Configure<Pages.CmsKit.Pages.IndexModel>(
toolbar =>
{
toolbar.AddButton(
@ -121,7 +122,7 @@ public class CmsKitAdminWebModule : AbpModule
);
});
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs.IndexModel>(
options.Configure<Pages.CmsKit.Blogs.IndexModel>(
toolbar =>
{
toolbar.AddButton(
@ -133,7 +134,7 @@ public class CmsKitAdminWebModule : AbpModule
);
});
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts.IndexModel>(
options.Configure<Pages.CmsKit.BlogPosts.IndexModel>(
toolbar =>
{
toolbar.AddButton(
@ -145,7 +146,7 @@ public class CmsKitAdminWebModule : AbpModule
);
});
options.Configure<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.IndexModel>(
options.Configure<Pages.CmsKit.Menus.MenuItems.IndexModel>(
toolbar =>
{
toolbar.AddButton(

24
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,

8
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

3
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
{

5
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.",

7
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": "<a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown</a> 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",

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/IPageRepository.cs

@ -22,4 +22,6 @@ public interface IPageRepository : IBasicRepository<Page, Guid>
Task<Page> FindBySlugAsync(string slug, CancellationToken cancellationToken = default);
Task<bool> ExistsAsync(string slug, CancellationToken cancellationToken = default);
Task<List<Page>> GetListOfHomePagesAsync(CancellationToken cancellationToken = default);
}

23
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)
{
}
}

11
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs

@ -20,6 +20,8 @@ public class Page : FullAuditedAggregateRoot<Guid>, 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<Guid>, 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<Guid>, IMultiTenant
{
Style = Check.Length(style, nameof(style), PageConsts.MaxStyleLength);
}
internal void SetIsHomePage(bool isHomePage)
{
IsHomePage = isHomePage;
}
}

123
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<Page> 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<Page> 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<Page> 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);
}
}
}

5
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Pages/EfCorePageRepository.cs

@ -63,4 +63,9 @@ public class EfCorePageRepository : EfCoreRepository<ICmsKitDbContext, Page, Gui
Check.NotNullOrEmpty(slug, nameof(slug));
return await (await GetDbSetAsync()).AnyAsync(x => x.Slug == slug, GetCancellationToken(cancellationToken));
}
public virtual Task<List<Page>> GetListOfHomePagesAsync(CancellationToken cancellationToken = default)
{
return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken));
}
}

5
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Pages/MongoPageRepository.cs

@ -71,4 +71,9 @@ public class MongoPageRepository : MongoDbRepository<ICmsKitMongoDbContext, Page
return await (await GetMongoQueryableAsync(cancellationToken)).AnyAsync(x => x.Slug == slug,
GetCancellationToken(cancellationToken));
}
public virtual Task<List<Page>> GetListOfHomePagesAsync(CancellationToken cancellationToken = default)
{
return GetListAsync(x => x.IsHomePage, cancellationToken: GetCancellationToken(cancellationToken));
}
}

1
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<PageDto> FindBySlugAsync([NotNull] string slug);
Task<PageDto> FindDefaultHomePageAsync();
}

32
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<PageDto> PageCache { get; }
public PagePublicAppService(IPageRepository pageRepository, PageManager pageManager, IDistributedCache<PageDto> pageCache)
{
PageRepository = pageRepository;
PageManager = pageManager;
PageCache = pageCache;
}
public virtual async Task<PageDto> FindBySlugAsync(string slug)
@ -30,4 +38,24 @@ public class PagePublicAppService : CmsKitPublicAppServiceBase, IPagePublicAppSe
return ObjectMapper.Map<Page, PageDto>(page);
}
public virtual async Task<PageDto> 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, PageDto>(page);
await PageCache.SetAsync("DefaultHomePage", pageDto,
new DistributedCacheEntryOptions { AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) });
}
return pageDto;
}
}

3
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;

10
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<IPagePublicAppServ
{ typeof(string), slug }
});
}
public virtual async Task<PageDto> FindDefaultHomePageAsync()
{
return await RequestAsync<PageDto>(nameof(FindDefaultHomePageAsync));
}
}

15
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"
}
}
},

6
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<PageDto> FindDefaultHomePageAsync()
{
return PageAppService.FindDefaultHomePageAsync();
}
}

23
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<AbpDistributedCacheOptions>(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<GlobalResourcesFeature>())
{
Configure<AbpLayoutHookOptions>(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();
}
}

28
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);
}
}

11
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<DefaultHomePageMiddleware>();
}
}

9
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));
};

13
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs

@ -130,4 +130,17 @@ public class PageAdminAppService_Tests : CmsKitApplicationTestBase
await Should.ThrowAsync<Exception>(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();
}
}

163
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<PageManager>();
testData = GetRequiredService<CmsKitTestData>();
pageRepository = GetRequiredService<IPageRepository>();
}
[Fact]
public async Task CreateAsync_ShouldWorkProperly_WithNonExistingSlug()
{
var title = "My awesome page";
var slug = "my-awesome-page";
var content = "<h1>My Awesome Page</h1><p>This is my awesome page content!</p>";
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 = "<h1>My Awesome Page</h1><p>This is my awesome page content!</p>";
var exception = await Should.ThrowAsync<PageSlugAlreadyExistsException>(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<PageSlugAlreadyExistsException>(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<PageManager>();
testData = GetRequiredService<CmsKitTestData>();
pageRepository = GetRequiredService<IPageRepository>();
}
[Fact]
public async Task CreateAsync_ShouldWorkProperly_WithNonExistingSlug()
{
var title = "My awesome page";
var slug = "my-awesome-page";
var content = "<h1>My Awesome Page</h1><p>This is my awesome page content!</p>";
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 = "<h1>My Awesome Page</h1><p>This is my awesome page content!</p>";
var exception = await Should.ThrowAsync<PageSlugAlreadyExistsException>(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<PageSlugAlreadyExistsException>(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();
}
}

134
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<TStartupModule> : CmsKitTestBase<TStartupModule>
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<CmsKitTestData>();
_pageRepository = GetRequiredService<IPageRepository>();
}
protected PageRepository_Test()
{
_cmsKitTestData = GetRequiredService<CmsKitTestData>();
_pageRepository = GetRequiredService<IPageRepository>();
}
[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();
}
}

Loading…
Cancel
Save