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 d54256bd8d..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,31 +58,20 @@ public class EfCoreBlogPostRepository : EfCoreRepository entityIdFilters = null; - if (tagId.HasValue) - { - entityIdFilters = (await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken)).Select(Guid.Parse).ToList(); - } - - var tagFilteredEntityIds = tagId.HasValue - ? await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken) - : null; - - var favoriteUserFilteredEntityIds = favoriteUserId.HasValue - ? await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType) - : null; + cancellationToken = GetCancellationToken(cancellationToken); + + var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); + var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken); var queryable = (await GetDbSetAsync()) - .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id)) - .WhereIf(tagFilteredEntityIds != null, x => tagFilteredEntityIds.Contains(x.Id.ToString())) - .WhereIf(favoriteUserFilteredEntityIds != null, x => favoriteUserFilteredEntityIds.Contains(x.Id.ToString())) + .WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id)) + .WhereIf(favoriteUserFilteredEntityIds.Count > 0, x => favoriteUserFilteredEntityIds.Contains(x.Id)) .WhereIf(blogId.HasValue, x => x.BlogId == blogId) .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) .WhereIf(statusFilter.HasValue, x => x.Status == statusFilter) .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)); - var count = await queryable.CountAsync(GetCancellationToken(cancellationToken)); - return count; + return await queryable.CountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetListAsync( @@ -99,27 +88,16 @@ public class EfCoreBlogPostRepository : EfCoreRepository(); var usersDbSet = dbContext.Set(); - List entityIdFilters = null; - if (tagId.HasValue) - { - entityIdFilters = (await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken)).Select(Guid.Parse).ToList(); - } - - var tagFilteredEntityIds = tagId.HasValue - ? await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken) - : null; - - var favoriteUserFilteredEntityIds = favoriteUserId.HasValue - ? await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType) - : null; + cancellationToken = GetCancellationToken(cancellationToken); + + var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); + var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken); var queryable = (await GetDbSetAsync()) - .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id)) - .WhereIf(tagFilteredEntityIds != null, x => tagFilteredEntityIds.Contains(x.Id.ToString())) - .WhereIf(favoriteUserFilteredEntityIds != null, x => favoriteUserFilteredEntityIds.Contains(x.Id.ToString())) + .WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id)) + .WhereIf(favoriteUserFilteredEntityIds.Count > 0, x => favoriteUserFilteredEntityIds.Contains(x.Id)) .WhereIf(blogId.HasValue, x => x.BlogId == blogId) .WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter)) .WhereIf(authorId.HasValue, x => x.AuthorId == authorId) @@ -204,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) {