From bf86f3fa51f51299e3cdbe59f8c4c2bc0b5ac3cb Mon Sep 17 00:00:00 2001 From: EngincanV Date: Fri, 29 Aug 2025 12:36:29 +0300 Subject: [PATCH] Fix favorite filter and tag filtering in blog post repositories Refactored tag and favorite user filtering logic in both EfCore and MongoDB blog post repositories to handle empty filter results and cancellation tokens more robustly. Updated BlogPostPublicAppService to pass favoriteUserId to GetCountAsync for accurate paging. Adjusted blog index view to improve favorite filter button visibility and logic. --- .../CmsKit/Blogs/EfCoreBlogPostRepository.cs | 82 +++++++++++++++---- .../MongoDB/Blogs/MongoBlogPostRepository.cs | 23 +++++- .../Public/Blogs/BlogPostPublicAppService.cs | 9 +- .../Pages/Public/CmsKit/Blogs/Index.cshtml | 27 +++--- 4 files changed, 109 insertions(+), 32 deletions(-) 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 8a1b85ae52..af2236c53c 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 @@ -58,13 +58,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository Guid.TryParse(x, out _)).Select(Guid.Parse).ToList() - : []; - - var favoriteUserFilteredEntityIds = favoriteUserId.HasValue - ? (await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList() - : []; + cancellationToken = GetCancellationToken(cancellationToken); + + var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); + var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken); var queryable = (await GetDbSetAsync()) .WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id)) @@ -93,13 +90,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository(); - var tagFilteredEntityIds = tagId.HasValue - ? (await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList() - : []; - - var favoriteUserFilteredEntityIds = favoriteUserId.HasValue - ? (await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList() - : []; + cancellationToken = GetCancellationToken(cancellationToken); + + var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); + var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken); var queryable = (await GetDbSetAsync()) .WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id)) @@ -188,4 +182,64 @@ public class EfCoreBlogPostRepository : EfCoreRepository x.BlogId == blogId, cancellationToken: cancellationToken); } + + private async Task> GetFavoriteEntityIdsByUserId(Guid? userId, CancellationToken cancellationToken = default) + { + var entityIdFilters = new List(); + if (!userId.HasValue) + { + return entityIdFilters; + } + + var entityIds = await _markedItemManager.GetEntityIdsFilteredByUserAsync( + userId.Value, + BlogPostConsts.EntityType, + CurrentTenant.Id, + cancellationToken + ); + + if (entityIds.Count == 0) + { + entityIdFilters.Add(Guid.Empty); + return entityIdFilters; + } + + foreach (var entityId in entityIds) + { + if (Guid.TryParse(entityId, out var parsedEntityId)) + { + entityIdFilters.Add(parsedEntityId); + } + } + + return entityIdFilters; + } + + private async Task> GetEntityIdsByTagId(Guid? tagId, CancellationToken cancellationToken = default) + { + var entityIdFilters = new List(); + if (!tagId.HasValue) + { + return entityIdFilters; + } + + var entityIds = + await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken); + + if (entityIds.Count == 0) + { + entityIdFilters.Add(Guid.Empty); + return entityIdFilters; + } + + foreach (var entityId in entityIds) + { + if (Guid.TryParse(entityId, out var parsedEntityId)) + { + entityIdFilters.Add(parsedEntityId); + } + } + + return entityIdFilters; + } } 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 78afc5a871..f2103c1580 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 @@ -86,8 +86,9 @@ public class MongoBlogPostRepository : MongoDbRepository( - await BlogPostRepository.GetCountAsync(blogId: blog.Id, tagId: input.TagId, - statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), + await BlogPostRepository.GetCountAsync( + blogId: blog.Id, + tagId: input.TagId, + favoriteUserId: favoriteUserId, + statusFilter: BlogPostStatus.Published, + authorId: input.AuthorId + ), ObjectMapper.Map, List>(blogPosts)); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml index 23f214f1e5..b6d0b41f9d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml @@ -14,7 +14,8 @@ @{ const string dummyImageSource = "/cms-kit/dummy-placeholder-320x180.png"; - var isMarkedItemFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled() && Model.MarkedItemsFeature?.IsEnabled == true; + var isMarkedItemFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled() && + (Model.MarkedItemsFeature?.IsEnabled == true || Model.FilterOnFavorites.HasValue); } @section styles { @@ -68,20 +69,20 @@
} -@if (Model.Blogs.TotalCount > 0) +@if (isMarkedItemFeatureEnabled) { - @if (isMarkedItemFeatureEnabled) - { - var filterOnFavorties = Model.FilterOnFavorites.GetValueOrDefault(); - string icon = filterOnFavorties ? "heart" : "heart-o"; - - + var filterOnFavorites = Model.FilterOnFavorites.GetValueOrDefault(); + string icon = filterOnFavorites ? "heart" : "heart-o"; + + +} - } +@if (Model.Blogs.TotalCount > 0) +{ @foreach (var blog in Model.Blogs.Items) {