Browse Source

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.
pull/23612/head
EngincanV 5 months ago
parent
commit
bf86f3fa51
  1. 82
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs
  2. 23
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs
  3. 9
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs
  4. 27
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml

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

@ -58,13 +58,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository<ICmsKitDbContext, BlogP
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default)
{
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))
@ -93,13 +90,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository<ICmsKitDbContext, BlogP
var dbContext = await GetDbContextAsync();
var usersDbSet = dbContext.Set<CmsUser>();
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<ICmsKitDbContext, BlogP
{
await DeleteAsync(x => x.BlogId == blogId, cancellationToken: cancellationToken);
}
private async Task<List<Guid>> GetFavoriteEntityIdsByUserId(Guid? userId, CancellationToken cancellationToken = default)
{
var entityIdFilters = new List<Guid>();
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<List<Guid>> GetEntityIdsByTagId(Guid? tagId, CancellationToken cancellationToken = default)
{
var entityIdFilters = new List<Guid>();
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;
}
}

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

@ -86,8 +86,9 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken);
var blogPostQueryable = await GetQueryableAsync();
var blogPostQueryable = await GetQueryableAsync(cancellationToken);
var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken);
@ -134,6 +135,12 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
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))
@ -153,9 +160,19 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
return entityIdFilters;
}
var entityIds =
await _markedItemManager.GetEntityIdsFilteredByUserAsync(userId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken);
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))

9
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs

@ -62,8 +62,13 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub
input.SkipCount, input.Sorting);
return new PagedResultDto<BlogPostCommonDto>(
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<BlogPost>, List<BlogPostCommonDto>>(blogPosts));
}

27
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<MarkedItemsFeature>() && Model.MarkedItemsFeature?.IsEnabled == true;
var isMarkedItemFeatureEnabled = GlobalFeatureManager.Instance.IsEnabled<MarkedItemsFeature>() &&
(Model.MarkedItemsFeature?.IsEnabled == true || Model.FilterOnFavorites.HasValue);
}
@section styles {
@ -68,20 +69,20 @@
<hr />
}
@if (Model.Blogs.TotalCount > 0)
@if (isMarkedItemFeatureEnabled)
{
@if (isMarkedItemFeatureEnabled)
{
var filterOnFavorties = Model.FilterOnFavorites.GetValueOrDefault();
string icon = filterOnFavorties ? "heart" : "heart-o";
<abp-button class="favorite-button badge text-bg-light my-2 border-light-subtle"
button-type="Light"
icon="@icon text-danger"
text="@L["FilterOnFavorites"]"
filter-on-favorites="@filterOnFavorties">
</abp-button>
var filterOnFavorites = Model.FilterOnFavorites.GetValueOrDefault();
string icon = filterOnFavorites ? "heart" : "heart-o";
<abp-button class="favorite-button badge text-bg-light my-2 border-light-subtle"
button-type="Light"
icon="@icon text-danger"
text="@L["FilterOnFavorites"]"
filter-on-favorites="@filterOnFavorites">
</abp-button>
}
}
@if (Model.Blogs.TotalCount > 0)
{
<abp-row id="blogs-container">
@foreach (var blog in Model.Blogs.Items)
{

Loading…
Cancel
Save