Browse Source

Merge pull request #23635 from abpframework/auto-merge/rel-9-3/3963

Merge branch dev with rel-9.3
pull/23638/head
Ma Liming 1 year ago
committed by GitHub
parent
commit
11b400856a
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 108
      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

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

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