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 9 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, BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var tagFilteredEntityIds = tagId.HasValue cancellationToken = GetCancellationToken(cancellationToken);
? (await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList()
: []; var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken);
var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken);
var favoriteUserFilteredEntityIds = favoriteUserId.HasValue
? (await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList()
: [];
var queryable = (await GetDbSetAsync()) var queryable = (await GetDbSetAsync())
.WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id)) .WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id))
@ -93,13 +90,10 @@ public class EfCoreBlogPostRepository : EfCoreRepository<ICmsKitDbContext, BlogP
var dbContext = await GetDbContextAsync(); var dbContext = await GetDbContextAsync();
var usersDbSet = dbContext.Set<CmsUser>(); var usersDbSet = dbContext.Set<CmsUser>();
var tagFilteredEntityIds = tagId.HasValue cancellationToken = GetCancellationToken(cancellationToken);
? (await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList()
: []; var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken);
var favoriteUserFilteredEntityIds = await GetFavoriteEntityIdsByUserId(favoriteUserId, cancellationToken);
var favoriteUserFilteredEntityIds = favoriteUserId.HasValue
? (await _markedItemManager.GetEntityIdsFilteredByUserAsync(favoriteUserId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken)).Where(x => Guid.TryParse(x, out _)).Select(Guid.Parse).ToList()
: [];
var queryable = (await GetDbSetAsync()) var queryable = (await GetDbSetAsync())
.WhereIf(tagFilteredEntityIds.Count > 0, x => tagFilteredEntityIds.Contains(x.Id)) .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); 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 cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken); cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken); var dbContext = await GetDbContextAsync(cancellationToken);
var blogPostQueryable = await GetQueryableAsync(); var blogPostQueryable = await GetQueryableAsync(cancellationToken);
var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken); var tagFilteredEntityIds = await GetEntityIdsByTagId(tagId, cancellationToken);
@ -134,6 +135,12 @@ 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);
if (entityIds.Count == 0)
{
entityIdFilters.Add(Guid.Empty);
return entityIdFilters;
}
foreach (var entityId in entityIds) foreach (var entityId in entityIds)
{ {
if (Guid.TryParse(entityId, out var parsedEntityId)) if (Guid.TryParse(entityId, out var parsedEntityId))
@ -153,9 +160,19 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
return entityIdFilters; return entityIdFilters;
} }
var entityIds = var entityIds = await _markedItemManager.GetEntityIdsFilteredByUserAsync(
await _markedItemManager.GetEntityIdsFilteredByUserAsync(userId.Value, BlogPostConsts.EntityType, CurrentTenant.Id, cancellationToken); userId.Value,
BlogPostConsts.EntityType,
CurrentTenant.Id,
cancellationToken
);
if (entityIds.Count == 0)
{
entityIdFilters.Add(Guid.Empty);
return entityIdFilters;
}
foreach (var entityId in entityIds) foreach (var entityId in entityIds)
{ {
if (Guid.TryParse(entityId, out var parsedEntityId)) 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); input.SkipCount, input.Sorting);
return new PagedResultDto<BlogPostCommonDto>( return new PagedResultDto<BlogPostCommonDto>(
await BlogPostRepository.GetCountAsync(blogId: blog.Id, tagId: input.TagId, await BlogPostRepository.GetCountAsync(
statusFilter: BlogPostStatus.Published, authorId: input.AuthorId), blogId: blog.Id,
tagId: input.TagId,
favoriteUserId: favoriteUserId,
statusFilter: BlogPostStatus.Published,
authorId: input.AuthorId
),
ObjectMapper.Map<List<BlogPost>, List<BlogPostCommonDto>>(blogPosts)); 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"; 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 { @section styles {
@ -68,20 +69,20 @@
<hr /> <hr />
} }
@if (Model.Blogs.TotalCount > 0) @if (isMarkedItemFeatureEnabled)
{ {
@if (isMarkedItemFeatureEnabled) var filterOnFavorites = Model.FilterOnFavorites.GetValueOrDefault();
{ string icon = filterOnFavorites ? "heart" : "heart-o";
var filterOnFavorties = Model.FilterOnFavorites.GetValueOrDefault(); <abp-button class="favorite-button badge text-bg-light my-2 border-light-subtle"
string icon = filterOnFavorties ? "heart" : "heart-o"; button-type="Light"
<abp-button class="favorite-button badge text-bg-light my-2 border-light-subtle" icon="@icon text-danger"
button-type="Light" text="@L["FilterOnFavorites"]"
icon="@icon text-danger" filter-on-favorites="@filterOnFavorites">
text="@L["FilterOnFavorites"]" </abp-button>
filter-on-favorites="@filterOnFavorties"> }
</abp-button>
} @if (Model.Blogs.TotalCount > 0)
{
<abp-row id="blogs-container"> <abp-row id="blogs-container">
@foreach (var blog in Model.Blogs.Items) @foreach (var blog in Model.Blogs.Items)
{ {

Loading…
Cancel
Save