Browse Source

Delete all `blog posts` when deleting the `blog`.

pull/22298/head
maliming 1 year ago
parent
commit
d32c889f31
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 20
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs
  2. 4
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs
  3. 17
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs
  4. 24
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs
  5. 8
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogAdminAppService_Tests.cs

20
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs

@ -27,8 +27,8 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi
public BlogAdminAppService( public BlogAdminAppService(
IBlogRepository blogRepository, IBlogRepository blogRepository,
BlogManager blogManager, BlogManager blogManager,
IBlogPostRepository blogPostRepository, IBlogPostRepository blogPostRepository,
BlogFeatureManager blogFeatureManager = null) BlogFeatureManager blogFeatureManager = null)
{ {
BlogRepository = blogRepository; BlogRepository = blogRepository;
@ -56,7 +56,7 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi
input.Sorting, input.Sorting,
input.MaxResultCount, input.MaxResultCount,
input.SkipCount); input.SkipCount);
var blogDtos = new PagedResultDto<BlogDto>(totalCount, ObjectMapper.Map<List<Blog>, List<BlogDto>>(blogs.Select(x => x.Blog).ToList())); var blogDtos = new PagedResultDto<BlogDto>(totalCount, ObjectMapper.Map<List<Blog>, List<BlogDto>>(blogs.Select(x => x.Blog).ToList()));
foreach (var blogDto in blogDtos.Items) foreach (var blogDto in blogDtos.Items)
@ -66,11 +66,11 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi
return blogDtos; return blogDtos;
} }
public virtual async Task<ListResultDto<BlogDto>> GetAllListAsync() public virtual async Task<ListResultDto<BlogDto>> GetAllListAsync()
{ {
var blogs = await BlogRepository.GetListWithBlogPostCountAsync(maxResultCount: int.MaxValue); var blogs = await BlogRepository.GetListWithBlogPostCountAsync(maxResultCount: int.MaxValue);
var blogDtos = new ListResultDto<BlogDto>(ObjectMapper.Map<List<Blog>, List<BlogDto>>(blogs.Select(x => x.Blog).ToList())); var blogDtos = new ListResultDto<BlogDto>(ObjectMapper.Map<List<Blog>, List<BlogDto>>(blogs.Select(x => x.Blog).ToList()));
foreach (var blogDto in blogDtos.Items) foreach (var blogDto in blogDtos.Items)
@ -86,7 +86,7 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi
{ {
var blog = await BlogManager.CreateAsync(input.Name, input.Slug); var blog = await BlogManager.CreateAsync(input.Name, input.Slug);
input.MapExtraPropertiesTo(blog); input.MapExtraPropertiesTo(blog);
await BlogRepository.InsertAsync(blog, autoSave: true); await BlogRepository.InsertAsync(blog, autoSave: true);
await BlogFeatureManager.SetDefaultsAsync(blog.Id); await BlogFeatureManager.SetDefaultsAsync(blog.Id);
@ -107,7 +107,7 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi
return ObjectMapper.Map<Blog, BlogDto>(blog); return ObjectMapper.Map<Blog, BlogDto>(blog);
} }
[Authorize(CmsKitAdminPermissions.Blogs.Delete)] [Authorize(CmsKitAdminPermissions.Blogs.Delete)]
public virtual async Task MoveAllBlogPostsAsync(Guid blogId, Guid? assignToBlogId) public virtual async Task MoveAllBlogPostsAsync(Guid blogId, Guid? assignToBlogId)
{ {
@ -116,9 +116,9 @@ public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppServi
} }
[Authorize(CmsKitAdminPermissions.Blogs.Delete)] [Authorize(CmsKitAdminPermissions.Blogs.Delete)]
public virtual Task DeleteAsync(Guid id) public virtual async Task DeleteAsync(Guid id)
{ {
await BlogPostRepository.DeleteByBlogIdAsync(id);
return BlogRepository.DeleteAsync(id); await BlogRepository.DeleteAsync(id);
} }
} }

4
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs

@ -48,4 +48,6 @@ public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid>
Task<bool> HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default); Task<bool> HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default);
Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default); Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default);
}
Task DeleteByBlogIdAsync(Guid blogId, CancellationToken cancellationToken = default);
}

17
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs

@ -176,27 +176,32 @@ public class EfCoreBlogPostRepository : EfCoreRepository<ICmsKitDbContext, BlogP
?? throw new EntityNotFoundException(typeof(CmsUser), id); ?? throw new EntityNotFoundException(typeof(CmsUser), id);
} }
private async Task<IQueryable<CmsUser>> CreateAuthorsQueryableAsync() protected virtual async Task<IQueryable<CmsUser>> CreateAuthorsQueryableAsync()
{ {
return (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct(); return (await GetDbContextAsync()).BlogPosts.Select(x => x.Author).Distinct();
} }
public virtual async Task<bool> HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default) public virtual async Task<bool> HasBlogPostWaitingForReviewAsync(CancellationToken cancellationToken = default)
{ {
return await (await GetDbSetAsync()) return await (await GetDbSetAsync())
.AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken)); .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken));
} }
public async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default) public virtual async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId = null, CancellationToken cancellationToken = default)
{ {
if (targetBlogId != null) if (targetBlogId != null)
{ {
await (await GetDbSetAsync()).Where(x => x.BlogId == sourceBlogId).ExecuteUpdateAsync(x => x.SetProperty(b => b.BlogId, targetBlogId.Value), GetCancellationToken(cancellationToken)); await (await GetDbSetAsync()).Where(x => x.BlogId == sourceBlogId).ExecuteUpdateAsync(x => x.SetProperty(b => b.BlogId, targetBlogId.Value), GetCancellationToken(cancellationToken));
} }
else else
{ {
await (await GetDbSetAsync()).Where(x => x.BlogId == sourceBlogId).ExecuteDeleteAsync(GetCancellationToken(cancellationToken)); await (await GetDbSetAsync()).Where(x => x.BlogId == sourceBlogId).ExecuteDeleteAsync(GetCancellationToken(cancellationToken));
} }
} }
}
public virtual async Task DeleteByBlogIdAsync(Guid blogId, CancellationToken cancellationToken = default)
{
await DeleteAsync(x => x.BlogId == blogId, cancellationToken: cancellationToken);
}
}

24
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs

@ -23,7 +23,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
private readonly MarkedItemManager _markedItemManager; private readonly MarkedItemManager _markedItemManager;
private EntityTagManager _entityTagManager; private EntityTagManager _entityTagManager;
public MongoBlogPostRepository( public MongoBlogPostRepository(
IMongoDbContextProvider<CmsKitMongoDbContext> dbContextProvider, IMongoDbContextProvider<CmsKitMongoDbContext> dbContextProvider,
MarkedItemManager markedItemManager, MarkedItemManager markedItemManager,
EntityTagManager entityTagManager) : base( EntityTagManager entityTagManager) : base(
dbContextProvider) dbContextProvider)
@ -63,7 +63,6 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken);
var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken); var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken);
return await (await GetMongoQueryableAsync(cancellationToken)) return await (await GetMongoQueryableAsync(cancellationToken))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(tagFilteredEntityIds.Any(), x => tagFilteredEntityIds.Contains(x.Id)) .WhereIf<BlogPost, IMongoQueryable<BlogPost>>(tagFilteredEntityIds.Any(), x => tagFilteredEntityIds.Contains(x.Id))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(favoriteUserFilteredEntityIds.Any(), x => favoriteUserFilteredEntityIds.Contains(x.Id)) .WhereIf<BlogPost, IMongoQueryable<BlogPost>>(favoriteUserFilteredEntityIds.Any(), x => favoriteUserFilteredEntityIds.Contains(x.Id))
@ -89,7 +88,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
cancellationToken = GetCancellationToken(cancellationToken); cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken); var dbContext = await GetDbContextAsync(cancellationToken);
var blogPostQueryable = await GetQueryableAsync(); var blogPostQueryable = await GetQueryableAsync();
var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken);
var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken); var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken);
@ -134,7 +133,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
var entityIds = var entityIds =
await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken);
foreach (var entityId in entityIds) foreach (var entityId in entityIds)
{ {
if (Guid.TryParse(entityId, out var parsedEntityId)) if (Guid.TryParse(entityId, out var parsedEntityId))
@ -156,7 +155,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
var entityIds = var entityIds =
await _markedItemManager.GetEntityIdsFilteredByUserAsync(userId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken); await _markedItemManager.GetEntityIdsFilteredByUserAsync(userId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken);
foreach (var entityId in entityIds) foreach (var entityId in entityIds)
{ {
if (Guid.TryParse(entityId, out var parsedEntityId)) if (Guid.TryParse(entityId, out var parsedEntityId))
@ -202,10 +201,10 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
?? throw new EntityNotFoundException(typeof(CmsUser), id); ?? throw new EntityNotFoundException(typeof(CmsUser), id);
} }
private async Task<IQueryable<CmsUser>> CreateAuthorsQueryableAsync(CancellationToken cancellationToken = default) protected virtual async Task<IQueryable<CmsUser>> CreateAuthorsQueryableAsync(CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken); cancellationToken = GetCancellationToken(cancellationToken);
var blogPostQueryable = (await GetQueryableAsync()) var blogPostQueryable = (await GetQueryableAsync())
.Where(x => x.Status == BlogPostStatus.Published); .Where(x => x.Status == BlogPostStatus.Published);
@ -229,7 +228,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
.AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, cancellationToken); .AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, cancellationToken);
} }
public async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId, CancellationToken cancellationToken = default) public virtual async Task UpdateBlogAsync(Guid sourceBlogId, Guid? targetBlogId, CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken); cancellationToken = GetCancellationToken(cancellationToken);
var blogPosts = await (await GetMongoQueryableAsync(cancellationToken)).Where(x => x.BlogId == sourceBlogId).ToListAsync(cancellationToken); var blogPosts = await (await GetMongoQueryableAsync(cancellationToken)).Where(x => x.BlogId == sourceBlogId).ToListAsync(cancellationToken);
@ -239,13 +238,18 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
{ {
blogPost.SetBlogId(targetBlogId.Value); blogPost.SetBlogId(targetBlogId.Value);
} }
await UpdateManyAsync(blogPosts, false, cancellationToken); await UpdateManyAsync(blogPosts, false, cancellationToken);
} }
else else
{ {
await DeleteManyAsync(blogPosts, false, cancellationToken); await DeleteManyAsync(blogPosts, false, cancellationToken);
} }
} }
public virtual async Task DeleteByBlogIdAsync(Guid blogId, CancellationToken cancellationToken = default)
{
await DeleteAsync(x => x.BlogId == blogId, cancellationToken: cancellationToken);
}
} }

8
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogAdminAppService_Tests.cs

@ -12,12 +12,14 @@ public class BlogAdminAppService_Tests : CmsKitApplicationTestBase
protected IBlogAdminAppService BlogAdminAppService { get; } protected IBlogAdminAppService BlogAdminAppService { get; }
protected CmsKitTestData CmsKitTestData { get; } protected CmsKitTestData CmsKitTestData { get; }
protected IBlogRepository BlogRepository { get; } protected IBlogRepository BlogRepository { get; }
protected IBlogPostRepository BlogPostRepository { get; }
public BlogAdminAppService_Tests() public BlogAdminAppService_Tests()
{ {
BlogAdminAppService = GetRequiredService<IBlogAdminAppService>(); BlogAdminAppService = GetRequiredService<IBlogAdminAppService>();
CmsKitTestData = GetRequiredService<CmsKitTestData>(); CmsKitTestData = GetRequiredService<CmsKitTestData>();
BlogRepository = GetRequiredService<IBlogRepository>(); BlogRepository = GetRequiredService<IBlogRepository>();
BlogPostRepository = GetRequiredService<IBlogPostRepository>();
} }
[Fact] [Fact]
@ -81,11 +83,17 @@ public class BlogAdminAppService_Tests : CmsKitApplicationTestBase
[Fact] [Fact]
public async Task DeleteAsync_ShouldWork() public async Task DeleteAsync_ShouldWork()
{ {
var posts = await BlogPostRepository.GetListAsync();
posts.ShouldContain(x => x.BlogId == CmsKitTestData.Blog_Id);
await BlogAdminAppService.DeleteAsync(CmsKitTestData.Blog_Id); await BlogAdminAppService.DeleteAsync(CmsKitTestData.Blog_Id);
await Should.ThrowAsync<EntityNotFoundException>( await Should.ThrowAsync<EntityNotFoundException>(
async () => async () =>
await BlogAdminAppService.GetAsync(CmsKitTestData.Blog_Id) await BlogAdminAppService.GetAsync(CmsKitTestData.Blog_Id)
); );
posts = await BlogPostRepository.GetListAsync();
posts.ShouldNotContain(x => x.BlogId == CmsKitTestData.Blog_Id);
} }
} }

Loading…
Cancel
Save