From a83c4f470cf6d6aae911494ebc4aa762add49fc7 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Feb 2021 16:25:37 +0300 Subject: [PATCH] CmsKit - Fix updating UrlSlug Check --- .../Admin/Blogs/BlogPostAdminAppService.cs | 16 ++++++----- .../Volo/CmsKit/Blogs/BlogPost.cs | 2 +- .../Volo/CmsKit/Blogs/BlogPostManager.cs | 9 +++++-- .../Volo/CmsKit/Blogs/IBlogPostManager.cs | 2 ++ .../Blogs/BlogPostManager_Tests.cs | 27 ++++++++++++++++--- .../Volo.CmsKit.TestBase/CmsKitTestData.cs | 4 +-- 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs index 3034311d70..cb95d1fe87 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs @@ -82,16 +82,20 @@ namespace Volo.CmsKit.Admin.Blogs [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] public override async Task UpdateAsync(Guid id, CreateUpdateBlogPostDto input) { - var entity = await BlogPostRepository.GetAsync(id); + var blogPost = await BlogPostRepository.GetAsync(id); - entity.SetTitle(input.Title); - entity.SetUrlSlug(input.UrlSlug); + blogPost.SetTitle(input.Title); - MapToEntity(input, entity); + if (blogPost.UrlSlug != input.UrlSlug) + { + await BlogPostManager.SetSlugUrlAsync(blogPost, input.UrlSlug); + } - await BlogPostManager.UpdateAsync(entity); + MapToEntity(input, blogPost); - return MapToGetOutputDto(entity); + await BlogPostManager.UpdateAsync(blogPost); + + return MapToGetOutputDto(blogPost); } public virtual async Task SetCoverImageAsync(Guid id, RemoteStreamContent streamContent) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs index 2a9f6673f2..53f44af35d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs @@ -44,7 +44,7 @@ namespace Volo.CmsKit.Blogs Title = Check.NotNullOrWhiteSpace(title, nameof(title), BlogPostConsts.MaxTitleLength); } - public void SetUrlSlug(string urlSlug) + internal void SetUrlSlug(string urlSlug) { Check.NotNullOrWhiteSpace(urlSlug, nameof(urlSlug), BlogPostConsts.MaxUrlSlugLength, BlogPostConsts.MinUrlSlugLength); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs index 228d8eccbf..b28e705191 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs @@ -34,11 +34,16 @@ namespace Volo.CmsKit.Blogs { await CheckBlogExistenceAsync(blogPost.BlogId); - await CheckUrlSlugExistenceAsync(blogPost.BlogId, blogPost.UrlSlug); - await blogPostRepository.UpdateAsync(blogPost); } + public async Task SetSlugUrlAsync(BlogPost blogPost, string newSlug) + { + await CheckUrlSlugExistenceAsync(blogPost.BlogId, newSlug); + + blogPost.SetUrlSlug(newSlug); + } + private async Task CheckUrlSlugExistenceAsync(Guid blogId, string urlSlug) { if (await blogPostRepository.SlugExistsAsync(blogId, urlSlug)) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostManager.cs index eb5c0170e1..5027fa8e38 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostManager.cs @@ -8,5 +8,7 @@ namespace Volo.CmsKit.Blogs Task CreateAsync(BlogPost blogPost); Task UpdateAsync(BlogPost blogPost); + + Task SetSlugUrlAsync(BlogPost blogPost, string newSlug); } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs index a9d7aa2da7..84eddeec3c 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs @@ -54,18 +54,39 @@ namespace Volo.CmsKit.Blogs public async Task UpdateAsync_ShoudlWorkProperly_WithCorrectData() { var newTitle = "Yet Another Post"; - var newUrlSlug = "yet-another-post"; var blogPost = await blogPostRepository.GetAsync(cmsKitTestData.BlogPost_1_Id); blogPost.SetTitle(newTitle); - blogPost.SetUrlSlug(newUrlSlug); await blogPostManager.UpdateAsync(blogPost); var updated = await blogPostRepository.GetAsync(cmsKitTestData.BlogPost_1_Id); updated.Title.ShouldBe(newTitle); - updated.UrlSlug.ShouldBe(newUrlSlug); + } + + [Fact] + public async Task SetUrlSlugAsync_ShouldWorkProperly_WithNonExistingSlug() + { + var newUrlSlug = "yet-another-post"; + + var blogPost = await blogPostRepository.GetAsync(cmsKitTestData.BlogPost_1_Id); + + await blogPostManager.SetSlugUrlAsync(blogPost, newUrlSlug); + + blogPost.UrlSlug.ShouldBe(newUrlSlug); + } + + [Fact] + public async Task SetUrlSlugAsync_ShouldThrowException_WithExistingSlug() + { + var blogPost = await blogPostRepository.GetAsync(cmsKitTestData.BlogPost_1_Id); + + var exception = await Should.ThrowAsync(async () => + await blogPostManager.SetSlugUrlAsync(blogPost, cmsKitTestData.BlogPost_2_UrlSlug)); + + exception.BlogId.ShouldBe(blogPost.BlogId); + exception.UrlSlug.ShouldBe(cmsKitTestData.BlogPost_2_UrlSlug); } } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index 99682fbbfb..a212d8505d 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -87,8 +87,8 @@ namespace Volo.CmsKit public Guid BlogPost_2_Id { get; } = Guid.NewGuid(); - public string BlogPost_2_Title => "How to use CmsKit?"; + public string BlogPost_2_Title => "How to use CmsKit"; - public string BlogPost_2_UrlSlug => "how-to-use-cms-kit?"; + public string BlogPost_2_UrlSlug => "how-to-use-cms-kit"; } }