From e15945822c9ea3046578b9d13ebec3bd0644c9b8 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 24 Feb 2021 11:46:04 +0300 Subject: [PATCH] CmsKit - Change BlogPostManager Creating method --- .../Admin/Blogs/BlogPostAdminAppService.cs | 30 ++++++++-------- .../Volo/CmsKit/Blogs/BlogPost.cs | 11 ++++-- .../Volo/CmsKit/Blogs/BlogPostManager.cs | 27 +++++++++++--- .../Volo/CmsKit/Blogs/IBlogPostManager.cs | 10 +++++- .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 12 ++++++- .../CmsKitDbContextModelCreatingExtensions.cs | 2 ++ .../Blogs/BlogPostManager_Tests.cs | 32 +++++++++++------ .../CmsKitDataSeedContributor.cs | 36 +++++++++++++++---- .../Volo.CmsKit.TestBase/CmsKitTestData.cs | 4 +-- 9 files changed, 122 insertions(+), 42 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 c510500d7c..a3392ec36c 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 @@ -57,18 +57,21 @@ namespace Volo.CmsKit.Admin.Blogs [Authorize(CmsKitAdminPermissions.BlogPosts.Create)] public override async Task CreateAsync(CreateBlogPostDto input) { - _ = await UserLookupService.GetByIdAsync(CurrentUser.GetId()); - - var entity = await BlogPostManager - .CreateAsync( - new BlogPost( - GuidGenerator.Create(), - input.BlogId, - input.Title, - input.Slug, - input.ShortDescription)); - - return await MapToGetOutputDtoAsync(entity); + var author = await UserLookupService.GetByIdAsync(CurrentUser.GetId()); + + var blog = await BlogRepository.GetAsync(input.BlogId); + + var blogPost = await BlogPostManager.CreateAsync( + author, + blog, + input.Title, + input.Slug, + input.ShortDescription, + CurrentTenant.Id); + + await Repository.InsertAsync(blogPost); + + return await MapToGetOutputDtoAsync(blogPost); } [Authorize(CmsKitAdminPermissions.BlogPosts.Update)] @@ -77,14 +80,13 @@ namespace Volo.CmsKit.Admin.Blogs var blogPost = await BlogPostRepository.GetAsync(id); blogPost.SetTitle(input.Title); + blogPost.SetShortDescription(input.ShortDescription); if (blogPost.Slug != input.Slug) { await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug); } - MapToEntity(input, blogPost); - await BlogPostManager.UpdateAsync(blogPost); return await MapToGetOutputDtoAsync(blogPost); 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 2e4949cd84..dc10725359 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 @@ -8,7 +8,7 @@ using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs { - public class BlogPost : FullAuditedAggregateRootWithUser, IMultiTenant + public class BlogPost : FullAuditedAggregateRoot, IMultiTenant { public virtual Guid BlogId { get; protected set; } @@ -23,18 +23,25 @@ namespace Volo.CmsKit.Blogs public virtual Guid? TenantId { get; protected set; } + [NotNull] + public Guid AuthorId { get; set; } + + public virtual CmsUser Author { get; set; } + protected BlogPost() { } - public BlogPost( + internal BlogPost( Guid id, Guid blogId, + Guid authorId, [NotNull] string title, [NotNull] string slug, [CanBeNull] string shortDescription = null) : base(id) { BlogId = blogId; + AuthorId = authorId; SetTitle(title); SetSlug(slug); ShortDescription = shortDescription; 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 7ba85f8ce6..4936b08c73 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 @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Services; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs { @@ -20,13 +21,31 @@ namespace Volo.CmsKit.Blogs BlogRepository = blogRepository; } - public virtual async Task CreateAsync(BlogPost blogPost) + public virtual async Task CreateAsync( + [NotNull] CmsUser author, + [NotNull] Blog blog, + [NotNull] string title, + [NotNull] string slug, + [CanBeNull] string shortDescription = null, + [CanBeNull] Guid? tenantId = null) { - await CheckBlogExistenceAsync(blogPost.BlogId); + Check.NotNull(author, nameof(author)); + Check.NotNull(blog, nameof(blog)); + + await CheckBlogExistenceAsync(blog.Id); + + var blogPost = new BlogPost( + GuidGenerator.Create(), + blog.Id, + author.Id, + Check.NotNullOrEmpty(title, nameof(title)), + Check.NotNullOrEmpty(slug, nameof(slug)), + shortDescription + ); - await CheckSlugExistenceAsync(blogPost.BlogId, blogPost.Slug); + await CheckSlugExistenceAsync(blog.Id, blogPost.Slug); - return await BlogPostRepository.InsertAsync(blogPost); + return blogPost; } public virtual async Task UpdateAsync(BlogPost blogPost) 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 9a3afebf71..227999aa7a 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 @@ -1,11 +1,19 @@ using JetBrains.Annotations; +using System; using System.Threading.Tasks; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs { public interface IBlogPostManager { - Task CreateAsync(BlogPost blogPost); + Task CreateAsync( + [NotNull] CmsUser author, + [NotNull] Blog blog, + [NotNull] string title, + [NotNull] string slug, + [CanBeNull] string shortDescription = null, + [CanBeNull] Guid? tenantId = null); Task UpdateAsync(BlogPost blogPost); diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index b914b4ad01..7e04d8fccb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -13,6 +13,7 @@ using System.Data.Common; using JetBrains.Annotations; using Volo.Abp; using Volo.Abp.Domain.Entities; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs { @@ -69,7 +70,16 @@ namespace Volo.CmsKit.Blogs public override async Task> WithDetailsAsync() { - return (await GetDbSetAsync()).Include(i => i.Creator); + var dbContext = await GetDbContextAsync(); + var blogPosts = await GetDbSetAsync(); + var users = dbContext.Set(); + + //var query = blogPosts.Join(users, o => o.AuthorId, i => i.Id, (blogPost, user) => new + //BlogPost + //{ + + //}); + return (await GetDbSetAsync()); } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 390ae37c7e..6ec5f49d7d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -214,6 +214,8 @@ namespace Volo.CmsKit.EntityFrameworkCore b.Property(p => p.ShortDescription).HasMaxLength(BlogPostConsts.MaxShortDescriptionLength); + b.Property(p => p.AuthorId).IsRequired(); + b.HasIndex(x => new { x.Slug, x.BlogId }); }); 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 2da60c8bff..7d2f859b0c 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 @@ -5,7 +5,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Guids; +using Volo.Abp.Users; using Volo.CmsKit.Tags; +using Volo.CmsKit.Users; using Xunit; namespace Volo.CmsKit.Blogs @@ -15,28 +17,33 @@ namespace Volo.CmsKit.Blogs private readonly IBlogPostManager blogPostManager; private readonly IGuidGenerator guidGenerator; private readonly IBlogPostRepository blogPostRepository; + private readonly IBlogRepository blogRepository; + private readonly ICmsUserRepository userRepository; private readonly CmsKitTestData cmsKitTestData; public BlogPostManager_Tests() { - this.blogPostManager = GetRequiredService(); - this.guidGenerator = GetRequiredService(); - this.blogPostRepository = GetRequiredService(); - this.cmsKitTestData = GetRequiredService(); + blogPostManager = GetRequiredService(); + guidGenerator = GetRequiredService(); + blogPostRepository = GetRequiredService(); + blogRepository = GetRequiredService(); + cmsKitTestData = GetRequiredService(); + userRepository = GetRequiredService(); } [Fact] - public async Task CreateAsync_ShouldWorkProperly_WithCorrectData() + public async Task CreateAsync_ShouldWorkProperly_WithExistingUserAndBlog() { var title = "New blog post"; var slug = "new-blog-post"; - var created = await blogPostManager.CreateAsync( - new BlogPost(guidGenerator.Create(), cmsKitTestData.Blog_Id, title, slug)); + var author = await userRepository.GetAsync(cmsKitTestData.User1Id); - created.Id.ShouldNotBe(Guid.Empty); + var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id); - var blogPost = await blogPostRepository.GetAsync(created.Id); + var blogPost = await blogPostManager.CreateAsync(author, blog, title, slug); + + blogPost.Id.ShouldNotBe(Guid.Empty); blogPost.Title.ShouldBe(title); blogPost.Slug.ShouldBe(slug); } @@ -44,10 +51,13 @@ namespace Volo.CmsKit.Blogs [Fact] public async Task CreateAsync_ShouldThrowException_WhenSlugAlreadyExists() { - var blogPost = new BlogPost(guidGenerator.Create(), cmsKitTestData.Blog_Id, "Any New Title", cmsKitTestData.BlogPost_1_Slug); + + var author = await userRepository.GetAsync(cmsKitTestData.User1Id); + + var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id); await Should.ThrowAsync(async () => - await blogPostManager.CreateAsync(blogPost)); + await blogPostManager.CreateAsync(author, blog, "Any New Title", cmsKitTestData.BlogPost_1_Slug)); } [Fact] diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 788b428d69..4215c7cf6a 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -41,6 +41,7 @@ namespace Volo.CmsKit private readonly IBlogRepository _blogRepository; private readonly IBlogFeatureRepository _blogFeatureRepository; private readonly IBlogPostRepository _blogPostRepository; + private readonly IBlogPostManager _blogPostManager; private readonly IOptions _options; private readonly IOptions _tagOptions; private readonly IMediaDescriptorRepository _mediaDescriptorRepository; @@ -60,6 +61,7 @@ namespace Volo.CmsKit IPageRepository pageRepository, IBlogRepository blogRepository, IBlogPostRepository blogPostRepository, + IBlogPostManager blogPostmanager, IBlogFeatureRepository blogFeatureRepository, IEntityTagManager entityTagManager, IOptions options, @@ -81,6 +83,7 @@ namespace Volo.CmsKit _pageRepository = pageRepository; _blogRepository = blogRepository; _blogPostRepository = blogPostRepository; + _blogPostManager = blogPostmanager; _blogFeatureRepository = blogFeatureRepository; _options = options; _tagOptions = tagOptions; @@ -131,10 +134,13 @@ namespace Volo.CmsKit { await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User1Id, "user1", "user1@volo.com", - "user", "1"))); + "user", "1")), + autoSave: true); + await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User2Id, "user2", "user2@volo.com", - "user", "2"))); + "user", "2")), + autoSave: true); } private async Task SeedCommentsAsync() @@ -325,11 +331,27 @@ namespace Volo.CmsKit private async Task SeedBlogsAsync() { - var blog = await _blogRepository.InsertAsync(new Blog(_cmsKitTestData.Blog_Id, _cmsKitTestData.BlogName, _cmsKitTestData.BlogSlug)); - - await _blogPostRepository.InsertAsync(new BlogPost(_cmsKitTestData.BlogPost_1_Id, blog.Id, _cmsKitTestData.BlogPost_1_Title, _cmsKitTestData.BlogPost_1_Slug, "Short desc 1")); - - await _blogPostRepository.InsertAsync(new BlogPost(_cmsKitTestData.BlogPost_2_Id, blog.Id, _cmsKitTestData.BlogPost_2_Title, _cmsKitTestData.BlogPost_2_Slug, "Short desc 2")); + var blog = await _blogRepository.InsertAsync(new Blog(_cmsKitTestData.Blog_Id, _cmsKitTestData.BlogName, _cmsKitTestData.BlogSlug), autoSave: true); + + var author = await _cmsUserRepository.GetAsync(_cmsKitTestData.User1Id); + + _cmsKitTestData.BlogPost_1_Id = + (await _blogPostRepository.InsertAsync( + await _blogPostManager.CreateAsync( + author, + blog, + _cmsKitTestData.BlogPost_1_Title, + _cmsKitTestData.BlogPost_1_Slug, + "Short desc 1"))).Id; + + _cmsKitTestData.BlogPost_2_Id = + (await _blogPostRepository.InsertAsync( + await _blogPostManager.CreateAsync( + author, + blog, + _cmsKitTestData.BlogPost_2_Title, + _cmsKitTestData.BlogPost_2_Slug, + "Short desc 2"))).Id; } private async Task SeedBlogFeaturesAsync() diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index d6a1aad24e..b28a2f0377 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -79,13 +79,13 @@ namespace Volo.CmsKit public string BlogSlug => "cms-blog"; - public Guid BlogPost_1_Id { get; } = Guid.NewGuid(); + public Guid BlogPost_1_Id { get; internal set; } public string BlogPost_1_Title => "How to install CmsKit?"; public string BlogPost_1_Slug => "how-to-install-cms-kit"; - public Guid BlogPost_2_Id { get; } = Guid.NewGuid(); + public Guid BlogPost_2_Id { get; internal set; } public string BlogPost_2_Title => "How to use CmsKit";