CmsKit - Change BlogPostManager Creating method

pull/7845/head
enisn 5 years ago
parent 2b2d298ee6
commit e15945822c

@ -57,18 +57,21 @@ namespace Volo.CmsKit.Admin.Blogs
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
public override async Task<BlogPostDto> CreateAsync(CreateBlogPostDto input) public override async Task<BlogPostDto> CreateAsync(CreateBlogPostDto input)
{ {
_ = await UserLookupService.GetByIdAsync(CurrentUser.GetId()); var author = await UserLookupService.GetByIdAsync(CurrentUser.GetId());
var entity = await BlogPostManager var blog = await BlogRepository.GetAsync(input.BlogId);
.CreateAsync(
new BlogPost( var blogPost = await BlogPostManager.CreateAsync(
GuidGenerator.Create(), author,
input.BlogId, blog,
input.Title, input.Title,
input.Slug, input.Slug,
input.ShortDescription)); input.ShortDescription,
CurrentTenant.Id);
return await MapToGetOutputDtoAsync(entity);
await Repository.InsertAsync(blogPost);
return await MapToGetOutputDtoAsync(blogPost);
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)] [Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
@ -77,14 +80,13 @@ namespace Volo.CmsKit.Admin.Blogs
var blogPost = await BlogPostRepository.GetAsync(id); var blogPost = await BlogPostRepository.GetAsync(id);
blogPost.SetTitle(input.Title); blogPost.SetTitle(input.Title);
blogPost.SetShortDescription(input.ShortDescription);
if (blogPost.Slug != input.Slug) if (blogPost.Slug != input.Slug)
{ {
await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug); await BlogPostManager.SetSlugUrlAsync(blogPost, input.Slug);
} }
MapToEntity(input, blogPost);
await BlogPostManager.UpdateAsync(blogPost); await BlogPostManager.UpdateAsync(blogPost);
return await MapToGetOutputDtoAsync(blogPost); return await MapToGetOutputDtoAsync(blogPost);

@ -8,7 +8,7 @@ using Volo.CmsKit.Users;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
public class BlogPost : FullAuditedAggregateRootWithUser<Guid, CmsUser>, IMultiTenant public class BlogPost : FullAuditedAggregateRoot<Guid>, IMultiTenant
{ {
public virtual Guid BlogId { get; protected set; } public virtual Guid BlogId { get; protected set; }
@ -23,18 +23,25 @@ namespace Volo.CmsKit.Blogs
public virtual Guid? TenantId { get; protected set; } public virtual Guid? TenantId { get; protected set; }
[NotNull]
public Guid AuthorId { get; set; }
public virtual CmsUser Author { get; set; }
protected BlogPost() protected BlogPost()
{ {
} }
public BlogPost( internal BlogPost(
Guid id, Guid id,
Guid blogId, Guid blogId,
Guid authorId,
[NotNull] string title, [NotNull] string title,
[NotNull] string slug, [NotNull] string slug,
[CanBeNull] string shortDescription = null) : base(id) [CanBeNull] string shortDescription = null) : base(id)
{ {
BlogId = blogId; BlogId = blogId;
AuthorId = authorId;
SetTitle(title); SetTitle(title);
SetSlug(slug); SetSlug(slug);
ShortDescription = shortDescription; ShortDescription = shortDescription;

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Services; using Volo.Abp.Domain.Services;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
@ -20,13 +21,31 @@ namespace Volo.CmsKit.Blogs
BlogRepository = blogRepository; BlogRepository = blogRepository;
} }
public virtual async Task<BlogPost> CreateAsync(BlogPost blogPost) public virtual async Task<BlogPost> 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) public virtual async Task UpdateAsync(BlogPost blogPost)

@ -1,11 +1,19 @@
using JetBrains.Annotations; using JetBrains.Annotations;
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
public interface IBlogPostManager public interface IBlogPostManager
{ {
Task<BlogPost> CreateAsync(BlogPost blogPost); Task<BlogPost> 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); Task UpdateAsync(BlogPost blogPost);

@ -13,6 +13,7 @@ using System.Data.Common;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
@ -69,7 +70,16 @@ namespace Volo.CmsKit.Blogs
public override async Task<IQueryable<BlogPost>> WithDetailsAsync() public override async Task<IQueryable<BlogPost>> WithDetailsAsync()
{ {
return (await GetDbSetAsync()).Include(i => i.Creator); var dbContext = await GetDbContextAsync();
var blogPosts = await GetDbSetAsync();
var users = dbContext.Set<CmsUser>();
//var query = blogPosts.Join(users, o => o.AuthorId, i => i.Id, (blogPost, user) => new
//BlogPost
//{
//});
return (await GetDbSetAsync());
} }
} }
} }

@ -214,6 +214,8 @@ namespace Volo.CmsKit.EntityFrameworkCore
b.Property(p => p.ShortDescription).HasMaxLength(BlogPostConsts.MaxShortDescriptionLength); b.Property(p => p.ShortDescription).HasMaxLength(BlogPostConsts.MaxShortDescriptionLength);
b.Property(p => p.AuthorId).IsRequired();
b.HasIndex(x => new { x.Slug, x.BlogId }); b.HasIndex(x => new { x.Slug, x.BlogId });
}); });

@ -5,7 +5,9 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Abp.Users;
using Volo.CmsKit.Tags; using Volo.CmsKit.Tags;
using Volo.CmsKit.Users;
using Xunit; using Xunit;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
@ -15,28 +17,33 @@ namespace Volo.CmsKit.Blogs
private readonly IBlogPostManager blogPostManager; private readonly IBlogPostManager blogPostManager;
private readonly IGuidGenerator guidGenerator; private readonly IGuidGenerator guidGenerator;
private readonly IBlogPostRepository blogPostRepository; private readonly IBlogPostRepository blogPostRepository;
private readonly IBlogRepository blogRepository;
private readonly ICmsUserRepository userRepository;
private readonly CmsKitTestData cmsKitTestData; private readonly CmsKitTestData cmsKitTestData;
public BlogPostManager_Tests() public BlogPostManager_Tests()
{ {
this.blogPostManager = GetRequiredService<IBlogPostManager>(); blogPostManager = GetRequiredService<IBlogPostManager>();
this.guidGenerator = GetRequiredService<IGuidGenerator>(); guidGenerator = GetRequiredService<IGuidGenerator>();
this.blogPostRepository = GetRequiredService<IBlogPostRepository>(); blogPostRepository = GetRequiredService<IBlogPostRepository>();
this.cmsKitTestData = GetRequiredService<CmsKitTestData>(); blogRepository = GetRequiredService<IBlogRepository>();
cmsKitTestData = GetRequiredService<CmsKitTestData>();
userRepository = GetRequiredService<ICmsUserRepository>();
} }
[Fact] [Fact]
public async Task CreateAsync_ShouldWorkProperly_WithCorrectData() public async Task CreateAsync_ShouldWorkProperly_WithExistingUserAndBlog()
{ {
var title = "New blog post"; var title = "New blog post";
var slug = "new-blog-post"; var slug = "new-blog-post";
var created = await blogPostManager.CreateAsync( var author = await userRepository.GetAsync(cmsKitTestData.User1Id);
new BlogPost(guidGenerator.Create(), cmsKitTestData.Blog_Id, title, slug));
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.Title.ShouldBe(title);
blogPost.Slug.ShouldBe(slug); blogPost.Slug.ShouldBe(slug);
} }
@ -44,10 +51,13 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task CreateAsync_ShouldThrowException_WhenSlugAlreadyExists() 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<BlogPostSlugAlreadyExistException>(async () => await Should.ThrowAsync<BlogPostSlugAlreadyExistException>(async () =>
await blogPostManager.CreateAsync(blogPost)); await blogPostManager.CreateAsync(author, blog, "Any New Title", cmsKitTestData.BlogPost_1_Slug));
} }
[Fact] [Fact]

@ -41,6 +41,7 @@ namespace Volo.CmsKit
private readonly IBlogRepository _blogRepository; private readonly IBlogRepository _blogRepository;
private readonly IBlogFeatureRepository _blogFeatureRepository; private readonly IBlogFeatureRepository _blogFeatureRepository;
private readonly IBlogPostRepository _blogPostRepository; private readonly IBlogPostRepository _blogPostRepository;
private readonly IBlogPostManager _blogPostManager;
private readonly IOptions<CmsKitOptions> _options; private readonly IOptions<CmsKitOptions> _options;
private readonly IOptions<CmsKitTagOptions> _tagOptions; private readonly IOptions<CmsKitTagOptions> _tagOptions;
private readonly IMediaDescriptorRepository _mediaDescriptorRepository; private readonly IMediaDescriptorRepository _mediaDescriptorRepository;
@ -60,6 +61,7 @@ namespace Volo.CmsKit
IPageRepository pageRepository, IPageRepository pageRepository,
IBlogRepository blogRepository, IBlogRepository blogRepository,
IBlogPostRepository blogPostRepository, IBlogPostRepository blogPostRepository,
IBlogPostManager blogPostmanager,
IBlogFeatureRepository blogFeatureRepository, IBlogFeatureRepository blogFeatureRepository,
IEntityTagManager entityTagManager, IEntityTagManager entityTagManager,
IOptions<CmsKitOptions> options, IOptions<CmsKitOptions> options,
@ -81,6 +83,7 @@ namespace Volo.CmsKit
_pageRepository = pageRepository; _pageRepository = pageRepository;
_blogRepository = blogRepository; _blogRepository = blogRepository;
_blogPostRepository = blogPostRepository; _blogPostRepository = blogPostRepository;
_blogPostManager = blogPostmanager;
_blogFeatureRepository = blogFeatureRepository; _blogFeatureRepository = blogFeatureRepository;
_options = options; _options = options;
_tagOptions = tagOptions; _tagOptions = tagOptions;
@ -131,10 +134,13 @@ namespace Volo.CmsKit
{ {
await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User1Id, "user1", await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User1Id, "user1",
"user1@volo.com", "user1@volo.com",
"user", "1"))); "user", "1")),
autoSave: true);
await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User2Id, "user2", await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User2Id, "user2",
"user2@volo.com", "user2@volo.com",
"user", "2"))); "user", "2")),
autoSave: true);
} }
private async Task SeedCommentsAsync() private async Task SeedCommentsAsync()
@ -325,11 +331,27 @@ namespace Volo.CmsKit
private async Task SeedBlogsAsync() private async Task SeedBlogsAsync()
{ {
var blog = await _blogRepository.InsertAsync(new Blog(_cmsKitTestData.Blog_Id, _cmsKitTestData.BlogName, _cmsKitTestData.BlogSlug)); var blog = await _blogRepository.InsertAsync(new Blog(_cmsKitTestData.Blog_Id, _cmsKitTestData.BlogName, _cmsKitTestData.BlogSlug), autoSave: true);
await _blogPostRepository.InsertAsync(new BlogPost(_cmsKitTestData.BlogPost_1_Id, blog.Id, _cmsKitTestData.BlogPost_1_Title, _cmsKitTestData.BlogPost_1_Slug, "Short desc 1")); var author = await _cmsUserRepository.GetAsync(_cmsKitTestData.User1Id);
await _blogPostRepository.InsertAsync(new BlogPost(_cmsKitTestData.BlogPost_2_Id, blog.Id, _cmsKitTestData.BlogPost_2_Title, _cmsKitTestData.BlogPost_2_Slug, "Short desc 2")); _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() private async Task SeedBlogFeaturesAsync()

@ -79,13 +79,13 @@ namespace Volo.CmsKit
public string BlogSlug => "cms-blog"; 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_Title => "How to install CmsKit?";
public string BlogPost_1_Slug => "how-to-install-cms-kit"; 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"; public string BlogPost_2_Title => "How to use CmsKit";

Loading…
Cancel
Save