Browse Source

add filter by tag option

pull/12511/head
Musa Demir 4 years ago
parent
commit
83bea6eaf2
No known key found for this signature in database GPG Key ID: 117DF92322553DC8
  1. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs
  2. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  3. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs
  4. 10
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs
  5. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs
  6. 28
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs
  7. 15
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs
  8. 23
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs
  9. 13
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs
  10. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs
  11. 6
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs
  12. 25
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml
  13. 7
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/TagViewComponent.cs
  14. 3
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml
  15. 6
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs

@ -11,6 +11,8 @@ public class BlogPostGetListInput : PagedAndSortedResultRequestDto
public Guid? BlogId { get; set; }
public Guid? AuthorId { get; set; }
public Guid? TagId { get; set; }
public BlogPostStatus? Status { get; set; }
}

4
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs

@ -101,11 +101,11 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe
{
var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id);
var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId,
var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId, input.TagId,
statusFilter: input.Status,
input.MaxResultCount, input.SkipCount, input.Sorting);
var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId);
var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId, tagId: input.TagId);
var dtoList = blogPosts.Select(x =>
{

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs

@ -13,6 +13,7 @@ public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid>
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
Guid? tagId = null,
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default);
@ -20,6 +21,7 @@ public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid>
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
Guid? tagId = null,
BlogPostStatus? statusFilter = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,

10
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/EntityTagManager.cs

@ -71,4 +71,12 @@ public class EntityTagManager : DomainService
await AddTagToEntityAsync(tag.Id, entityType, entityId, CurrentTenant?.Id);
}
}
}
public async Task<List<string>> GetEntityIdsFilteredByTagAsync(
[NotNull] Guid tagId,
[CanBeNull] Guid? tenantId,
CancellationToken cancellationToken = default)
{
return await EntityTagRepository.GetEntityIdsFilteredByTagAsync(tagId, tenantId, cancellationToken);
}
}

6
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs

@ -1,5 +1,6 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
@ -15,4 +16,9 @@ public interface IEntityTagRepository : IBasicRepository<EntityTag>
CancellationToken cancellationToken = default);
Task DeleteManyAsync(Guid[] tagIds, CancellationToken cancellationToken = default);
Task<List<string>> GetEntityIdsFilteredByTagAsync(
[NotNull] Guid tagId,
[CanBeNull] Guid? tenantId,
CancellationToken cancellationToken = default);
}

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

@ -11,14 +11,20 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.CmsKit.EntityFrameworkCore;
using Volo.CmsKit.Tags;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.Blogs;
public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPost, Guid>, IBlogPostRepository
{
public EfCoreBlogPostRepository(IDbContextProvider<CmsKitDbContext> dbContextProvider) : base(dbContextProvider)
private EntityTagManager _entityTagManager;
public EfCoreBlogPostRepository(
IDbContextProvider<CmsKitDbContext> dbContextProvider,
EntityTagManager entityTagManager) : base(dbContextProvider)
{
_entityTagManager = entityTagManager;
}
public async Task<BlogPost> GetBySlugAsync(
@ -43,10 +49,18 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
Guid? tagId = null,
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default)
{
List<string> entityIdFilters = null;
if (tagId.HasValue)
{
entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken);
}
var queryable = (await GetDbSetAsync())
.WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString()))
.WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId)
.WhereIf(statusFilter.HasValue, x => x.Status == statusFilter)
@ -60,6 +74,7 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
Guid? tagId = null,
BlogPostStatus? statusFilter = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
@ -71,7 +86,14 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
var blogPostsDbSet = dbContext.Set<BlogPost>();
var usersDbSet = dbContext.Set<CmsUser>();
var queryable = blogPostsDbSet
List<string> entityIdFilters = null;
if (tagId.HasValue)
{
entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken);
}
var queryable = (await GetDbSetAsync())
.WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString()))
.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)
@ -138,4 +160,4 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
return await (await GetDbSetAsync())
.AnyAsync(x => x.Status == BlogPostStatus.WaitingForReview, GetCancellationToken(cancellationToken));
}
}
}

15
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs

@ -1,8 +1,10 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
@ -39,4 +41,15 @@ public class EfCoreEntityTagRepository : EfCoreRepository<ICmsKitDbContext, Enti
x.TenantId == tenantId,
cancellationToken: GetCancellationToken(cancellationToken));
}
}
public virtual async Task<List<string>> GetEntityIdsFilteredByTagAsync(
[NotNull] Guid tagId,
[CanBeNull] Guid? tenantId,
CancellationToken cancellationToken = default)
{
return await (await GetDbContextAsync()).Set<EntityTag>()
.Where(q => q.TagId == tagId && q.TenantId == tenantId)
.Select(q => q.EntityId)
.ToListAsync(cancellationToken: GetCancellationToken(cancellationToken));
}
}

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

@ -12,15 +12,18 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.Tags;
using Volo.CmsKit.Users;
namespace Volo.CmsKit.MongoDB.Blogs;
public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, BlogPost, Guid>, IBlogPostRepository
{
public MongoBlogPostRepository(IMongoDbContextProvider<CmsKitMongoDbContext> dbContextProvider) : base(
private EntityTagManager _entityTagManager;
public MongoBlogPostRepository(IMongoDbContextProvider<CmsKitMongoDbContext> dbContextProvider, EntityTagManager entityTagManager) : base(
dbContextProvider)
{
_entityTagManager = entityTagManager;
}
public virtual async Task<BlogPost> GetBySlugAsync(Guid blogId, [NotNull] string slug,
@ -44,12 +47,20 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
Guid? tagId = null,
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
List<string> entityIdFilters = null;
if (tagId.HasValue)
{
entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken);
}
return await (await GetMongoQueryableAsync(cancellationToken))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString()))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(authorId.HasValue, x => x.AuthorId == authorId)
@ -61,6 +72,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
Guid? tagId = null,
BlogPostStatus? statusFilter = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
@ -70,10 +82,17 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
cancellationToken = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(cancellationToken);
var blogPostQueryable = await GetQueryableAsync();
List<string> entityIdFilters = null;
if (tagId.HasValue)
{
entityIdFilters = await _entityTagManager.GetEntityIdsFilteredByTagAsync(tagId.Value, CurrentTenant.Id, cancellationToken);
}
var usersQueryable = dbContext.Collection<CmsUser>().AsQueryable();
var queryable = blogPostQueryable
.WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString()))
.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)

13
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs

@ -2,6 +2,7 @@
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
@ -39,4 +40,16 @@ public class MongoEntityTagRepository : MongoDbRepository<ICmsKitMongoDbContext,
x.TenantId == tenantId,
cancellationToken: GetCancellationToken(cancellationToken));
}
public virtual async Task<List<string>> GetEntityIdsFilteredByTagAsync(
[NotNull] Guid tagId,
[CanBeNull] Guid? tenantId,
CancellationToken cancellationToken = default)
{
var blogPostQueryable = (await GetQueryableAsync())
.Where(q => q.TagId == tagId && q.TenantId == tenantId)
.Select(q => q.EntityId);
return await AsyncExecuter.ToListAsync(blogPostQueryable, GetCancellationToken(cancellationToken));
}
}

4
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Blogs/BlogPostGetListInput.cs

@ -5,5 +5,7 @@ namespace Volo.CmsKit.Public.Blogs;
public class BlogPostGetListInput : PagedAndSortedResultRequestDto
{
public Guid? AuthorId { get; set; }
public Guid? AuthorId { get; set; }
public Guid? TagId { get; set; }
}

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

@ -38,11 +38,13 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub
{
var blog = await BlogRepository.GetBySlugAsync(blogSlug);
var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, BlogPostStatus.Published, input.MaxResultCount,
var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.TagId,
BlogPostStatus.Published, input.MaxResultCount,
input.SkipCount, input.Sorting);
return new PagedResultDto<BlogPostPublicDto>(
await BlogPostRepository.GetCountAsync(blogId: blog.Id, statusFilter: BlogPostStatus.Published, authorId: input.AuthorId),
await BlogPostRepository.GetCountAsync(blogId: blog.Id, tagId: input.TagId,
statusFilter: BlogPostStatus.Published, authorId: input.AuthorId),
ObjectMapper.Map<List<BlogPost>, List<BlogPostPublicDto>>(blogPosts));
}

25
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/Default.cshtml

@ -2,16 +2,29 @@
@model TagViewComponent.TagViewModel
<div class="my-3">
<div class="cms-tags-area">
@if (Model.Tags != null)
<div class="my-3">
<div class="cms-tags-area">
@if (Model.Tags != null)
{
foreach (var tag in Model.Tags)
{
foreach (var tag in Model.Tags)
if (Model.UrlFormat.IsNullOrWhiteSpace())
{
<span class="badge bg-light px-3 py-2 cmskit-tag font-weight-normal">
@tag.Name
</span>
}
else
{
var formattedUrl = Model.UrlFormat.Replace("{TagId}", tag.Id.ToString());
<a href="@formattedUrl">
<span class="badge bg-light px-3 py-2 cmskit-tag font-weight-normal">
@tag.Name
</span>
</a>
}
}
</div>
</div>
}
</div>
</div>

7
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Tags/TagViewComponent.cs

@ -26,7 +26,8 @@ public class TagViewComponent : AbpViewComponent
public virtual async Task<IViewComponentResult> InvokeAsync(
string entityType,
string entityId)
string entityId,
string urlFormat)
{
var tagDtos = await TagAppService.GetAllRelatedTagsAsync(entityType, entityId);
@ -34,7 +35,8 @@ public class TagViewComponent : AbpViewComponent
{
EntityId = entityId,
EntityType = entityType,
Tags = tagDtos
Tags = tagDtos,
UrlFormat = urlFormat
};
return View("~/Pages/CmsKit/Shared/Components/Tags/Default.cshtml", viewModel);
@ -45,5 +47,6 @@ public class TagViewComponent : AbpViewComponent
public List<TagDto> Tags { get; set; }
public string EntityId { get; set; }
public string EntityType { get; set; }
public string UrlFormat { get; set; }
}
}

3
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml

@ -85,7 +85,8 @@
@await Component.InvokeAsync(typeof(TagViewComponent), new
{
entityType = Volo.CmsKit.Blogs.BlogPostConsts.EntityType,
entityId = Model.BlogPost.Id.ToString()
entityId = Model.BlogPost.Id.ToString(),
urlFormat = $"/blogs/{Model.BlogSlug}?tagId={{TagId}}"
})
}
}

6
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs

@ -24,6 +24,9 @@ public class IndexModel : CmsKitPublicPageModelBase
[BindProperty(SupportsGet = true)]
public Guid? AuthorId { get; set; }
[BindProperty(SupportsGet = true)]
public Guid? TagId { get; set; }
public PagedResultDto<BlogPostPublicDto> Blogs { get; private set; }
public PagerModel PagerModel => new PagerModel(Blogs.TotalCount, Blogs.Items.Count, CurrentPage, PageSize, Request.Path.ToString());
@ -45,7 +48,8 @@ public class IndexModel : CmsKitPublicPageModelBase
{
SkipCount = PageSize * (CurrentPage - 1),
MaxResultCount = PageSize,
AuthorId = AuthorId
AuthorId = AuthorId,
TagId = TagId
});
if (AuthorId != null)

Loading…
Cancel
Save