diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs index 6c75e7fec3..624ee2f913 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs @@ -23,16 +23,21 @@ namespace Volo.CmsKit.MongoDB.Blogs { } - public Task GetBySlugAsync(Guid blogId, [NotNull] string slug, + public async Task GetBySlugAsync(Guid blogId, [NotNull] string slug, CancellationToken cancellationToken = default) { Check.NotNullOrEmpty(slug, nameof(slug)); - return GetAsync(x => + var blogPost = await GetAsync(x => x.BlogId == blogId && x.Slug.ToLower() == slug, - includeDetails: true, cancellationToken: GetCancellationToken(cancellationToken)); + + var dbContext = await GetDbContextAsync(); + + blogPost.Author = await dbContext.Collection().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId); + + return blogPost; } public async Task GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) @@ -48,9 +53,10 @@ namespace Volo.CmsKit.MongoDB.Blogs { var token = GetCancellationToken(cancellationToken); var dbContext = await GetDbContextAsync(token); - var blogPostQueryable = await WithDetailsAsync(); + var blogPostQueryable = dbContext.Collection().AsQueryable(); + var usersQueryable = dbContext.Collection().AsQueryable(); - var queryable = blogPostQueryable + IQueryable queryable = blogPostQueryable .Where(x => x.BlogId == blogId); if (!sorting.IsNullOrWhiteSpace()) @@ -58,11 +64,22 @@ namespace Volo.CmsKit.MongoDB.Blogs queryable = queryable.OrderBy(sorting); } - queryable = queryable - .Skip(skipCount) - .Take(maxResultCount); + var combinedQueryable = queryable + .Join( + usersQueryable, + o => o.AuthorId, + i => i.Id, + (blogPost, user) => new { blogPost, user }) + .Skip(skipCount) + .Take(maxResultCount); + + var combinedResult = await AsyncExecuter.ToListAsync(combinedQueryable, GetCancellationToken(cancellationToken)); - return await AsyncExecuter.ToListAsync(queryable, token); + return combinedResult.Select(s => + { + s.blogPost.Author = s.user; + return s.blogPost; + }).ToList(); } public async Task SlugExistsAsync(Guid blogId, [NotNull] string slug, diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs index 1b44e3c5b6..c758711339 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs @@ -60,6 +60,18 @@ namespace Volo.CmsKit.Blogs blogPost.Slug.ShouldBe(testData.BlogPost_1_Slug); } + [Fact] + public async Task GetBySlugAsync_ShouldHaveAuthor_WithCorrectParameters() + { + var blogPost = await blogPostRepository.GetBySlugAsync(testData.Blog_Id, testData.BlogPost_1_Slug); + + blogPost.ShouldNotBeNull(); + blogPost.Id.ShouldBe(testData.BlogPost_1_Id); + blogPost.Slug.ShouldBe(testData.BlogPost_1_Slug); + blogPost.Author.ShouldNotBeNull(); + blogPost.Author.Id.ShouldBe(testData.User1Id); + } + [Fact] public async Task GetBySlugAsync_ShouldThrowException_WithNonExistingBlogPostSlug() { @@ -92,6 +104,18 @@ namespace Volo.CmsKit.Blogs result.Count.ShouldBe(2); } + [Fact] + public async Task GetPagedListAsync_ShouldHaveAuthor_WithBlogId_WhileGetting10_WithoutSorting() + { + var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); + + result.ShouldNotBeNull(); + result.ShouldNotBeEmpty(); + result.Count.ShouldBe(2); + + result.ForEach(blogPost => blogPost.Author.ShouldNotBeNull()); + } + [Fact] public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1_WithoutSorting() {