Browse Source

Merge pull request #7995 from abpframework/cotur/cms-kit/blogposts

Refactor BlogPosts and add filter to ui
pull/8022/head
İlkay İlknur 6 years ago
committed by GitHub
parent
commit
c62160c726
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs
  2. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs
  3. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  4. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs
  5. 9
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml
  6. 15
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js
  7. 17
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs
  8. 58
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs
  9. 42
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs
  10. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs
  11. 2
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs
  12. 10
      modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs

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

@ -0,0 +1,12 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Blogs
{
public class BlogPostGetListInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
public Guid? BlogId { get; set; }
}
}

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs

@ -1,8 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
@ -10,7 +7,7 @@ namespace Volo.CmsKit.Admin.Blogs
: ICrudAppService< : ICrudAppService<
BlogPostDto, BlogPostDto,
Guid, Guid,
PagedAndSortedResultRequestDto, BlogPostGetListInput,
CreateBlogPostDto, CreateBlogPostDto,
UpdateBlogPostDto> UpdateBlogPostDto>
{ {

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

@ -3,10 +3,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.BlobStoring;
using Volo.Abp.Content;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.Abp.Users; using Volo.Abp.Users;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
@ -87,20 +83,15 @@ namespace Volo.CmsKit.Admin.Blogs
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)] [Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual async Task<PagedResultDto<BlogPostDto>> GetListAsync(PagedAndSortedResultRequestDto input) public virtual async Task<PagedResultDto<BlogPostDto>> GetListAsync(BlogPostGetListInput input)
{ {
if (input.Sorting.IsNullOrEmpty()) var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.MaxResultCount, input.SkipCount, input.Sorting);
{
input.Sorting = nameof(BlogPost.CreationTime) + " desc";
}
var blogPosts = await BlogPostRepository.GetPagedListAsync(input.SkipCount, input.MaxResultCount, input.Sorting, includeDetails: true);
var count = await BlogPostRepository.GetCountAsync(); var count = await BlogPostRepository.GetCountAsync(input.Filter);
return new PagedResultDto<BlogPostDto>( var dtoList = ObjectMapper.Map<List<BlogPost>, List<BlogPostDto>>(blogPosts);
count,
ObjectMapper.Map<List<BlogPost>, List<BlogPostDto>>(blogPosts)); return new PagedResultDto<BlogPostDto>(count, dtoList);
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Delete)] [Authorize(CmsKitAdminPermissions.BlogPosts.Delete)]

2
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs

@ -49,7 +49,7 @@ namespace Volo.CmsKit.Admin.Blogs
[HttpGet] [HttpGet]
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)] [Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual Task<PagedResultDto<BlogPostDto>> GetListAsync(PagedAndSortedResultRequestDto input) public virtual Task<PagedResultDto<BlogPostDto>> GetListAsync(BlogPostGetListInput input)
{ {
return BlogPostAdminAppService.GetListAsync(input); return BlogPostAdminAppService.GetListAsync(input);
} }

9
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml

@ -1,5 +1,6 @@
@page @page
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageSearchBox
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts @using Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts
@using Volo.CmsKit.Admin.Web.Pages @using Volo.CmsKit.Admin.Web.Pages
@using Volo.CmsKit.Admin.Web.Menus @using Volo.CmsKit.Admin.Web.Menus
@ -27,7 +28,13 @@
<div id="CmsKitBlogPostsWrapper"> <div id="CmsKitBlogPostsWrapper">
<abp-card> <abp-card>
<abp-card-body> <abp-card-body>
<abp-table striped-rows="true" id="BlogPostsTable" class="nowrap"></abp-table> <abp-row>
<abp-column>
@await Component.InvokeAsync(typeof(AbpPageSearchBoxViewComponent))
</abp-column>
</abp-row>
</abp-card-body> </abp-card-body>
</abp-card> </abp-card>
<abp-table striped-rows="true" id="BlogPostsTable" class="nowrap"></abp-table>
</div> </div>

15
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js

@ -4,8 +4,12 @@ $(function () {
var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin;
var $blogPostWrapper = $('#CmsKitBlogPostsWrapper'); var getFilter = function () {
return {
filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val()
};
};
var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({ var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({
processing: true, processing: true,
serverSide: true, serverSide: true,
@ -16,7 +20,7 @@ $(function () {
scrollX: true, scrollX: true,
ordering: true, ordering: true,
order: [[1, "desc"]], order: [[1, "desc"]],
ajax: abp.libs.datatables.createAjax(blogsService.getList), ajax: abp.libs.datatables.createAjax(blogsService.getList, getFilter),
columnDefs: [ columnDefs: [
{ {
title: l("Details"), title: l("Details"),
@ -61,6 +65,11 @@ $(function () {
] ]
})); }));
$('#CmsKitBlogPostsWrapper form.page-search-form').submit(function (e) {
e.preventDefault();
dataTable.ajax.reload();
});
$('#AbpContentToolbar button[name=CreateBlogPost]').on('click', function (e) { $('#AbpContentToolbar button[name=CreateBlogPost]').on('click', function (e) {
e.preventDefault(); e.preventDefault();
window.location.href = "BlogPosts/Create" window.location.href = "BlogPosts/Create"

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

@ -8,12 +8,21 @@ namespace Volo.CmsKit.Blogs
{ {
public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid> public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid>
{ {
Task<int> GetCountAsync(
string filter = null,
Guid? blogId = null,
CancellationToken cancellationToken = default);
Task<List<BlogPost>> GetListAsync(
string filter = null,
Guid? blogId = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
CancellationToken cancellationToken = default);
Task<bool> SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task<bool> SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default);
Task<BlogPost> GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task<BlogPost> GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default);
Task<List<BlogPost>> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, string sorting, bool includeDetails = false, CancellationToken cancellationToken = default);
Task<int> GetCountAsync(Guid blogId, CancellationToken cancellationToken = default);
} }
} }

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

@ -38,43 +38,53 @@ namespace Volo.CmsKit.Blogs
return blogPost; return blogPost;
} }
public async Task<int> GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) public virtual async Task<int> GetCountAsync(
string filter = null,
Guid? blogId = null,
CancellationToken cancellationToken = default)
{ {
return await (await GetQueryableAsync()).CountAsync( var queryable = (await GetDbSetAsync())
x => x.BlogId == blogId, .WhereIf(blogId.HasValue, x => x.BlogId == blogId)
GetCancellationToken(cancellationToken)); .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
var count = await queryable.CountAsync(GetCancellationToken(cancellationToken));
return count;
} }
public async Task<List<BlogPost>> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, public virtual async Task<List<BlogPost>> GetListAsync(
string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) string filter = null,
Guid? blogId = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
CancellationToken cancellationToken = default)
{ {
var dbContext = await GetDbContextAsync(); var dbContext = await GetDbContextAsync();
var blogPostsDbSet = dbContext.Set<BlogPost>(); var blogPostsDbSet = dbContext.Set<BlogPost>();
var usersDbSet = dbContext.Set<CmsUser>(); var usersDbSet = dbContext.Set<CmsUser>();
var queryable = blogPostsDbSet var queryable = blogPostsDbSet
.Where(x => x.BlogId == blogId); .WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
if (!sorting.IsNullOrWhiteSpace())
{
queryable = queryable.OrderBy(sorting);
}
queryable = queryable.OrderBy(sorting ?? $"{nameof(BlogPost.CreationTime)} desc");
var combinedResult = await queryable var combinedResult = await queryable
.Join( .Join(
usersDbSet, usersDbSet,
o => o.AuthorId, o => o.AuthorId,
i => i.Id, i => i.Id,
(blogPost,user) => new { blogPost, user }) (blogPost,user) => new { blogPost, user })
.Skip(skipCount) .Skip(skipCount)
.Take(maxResultCount) .Take(maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
return combinedResult.Select(s => return combinedResult.Select(s =>
{ {
s.blogPost.Author = s.user; s.blogPost.Author = s.user;
return s.blogPost; return s.blogPost;
}).ToList(); }).ToList();
} }
public async Task<bool> SlugExistsAsync(Guid blogId, [NotNull] string slug, public async Task<bool> SlugExistsAsync(Guid blogId, [NotNull] string slug,

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

@ -27,41 +27,51 @@ namespace Volo.CmsKit.MongoDB.Blogs
{ {
Check.NotNullOrEmpty(slug, nameof(slug)); Check.NotNullOrEmpty(slug, nameof(slug));
var token = GetCancellationToken(cancellationToken);
var blogPost = await GetAsync(x => var blogPost = await GetAsync(x =>
x.BlogId == blogId && x.BlogId == blogId &&
x.Slug.ToLower() == slug, x.Slug.ToLower() == slug,
cancellationToken: GetCancellationToken(cancellationToken)); cancellationToken: token);
var dbContext = await GetDbContextAsync(); var dbContext = await GetDbContextAsync(token);
blogPost.Author = await dbContext.Collection<CmsUser>().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId); blogPost.Author = await dbContext.Collection<CmsUser>().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId, token);
return blogPost; return blogPost;
} }
public async Task<int> GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) public async Task<int> GetCountAsync(
string filter = null,
Guid? blogId = null,
CancellationToken cancellationToken = default)
{ {
return await AsyncExecuter.CountAsync( var token = GetCancellationToken(cancellationToken);
await WithDetailsAsync(),
x => x.BlogId == blogId, return await (await GetMongoQueryableAsync(token))
GetCancellationToken(cancellationToken)); .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)
.CountAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<BlogPost>> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, public async Task<List<BlogPost>> GetListAsync(
string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) string filter = null,
Guid? blogId = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
CancellationToken cancellationToken = default)
{ {
var token = GetCancellationToken(cancellationToken); var token = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(token); var dbContext = await GetDbContextAsync(token);
var blogPostQueryable = dbContext.Collection<BlogPost>().AsQueryable(); var blogPostQueryable = dbContext.Collection<BlogPost>().AsQueryable();
var usersQueryable = dbContext.Collection<CmsUser>().AsQueryable(); var usersQueryable = dbContext.Collection<CmsUser>().AsQueryable();
IQueryable<BlogPost> queryable = blogPostQueryable var queryable = blogPostQueryable
.Where(x => x.BlogId == blogId); .WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
if (!sorting.IsNullOrWhiteSpace()) queryable = queryable.OrderBy(sorting ?? $"{nameof(BlogPost.CreationTime)} desc");
{
queryable = queryable.OrderBy(sorting);
}
var combinedQueryable = queryable var combinedQueryable = queryable
.Join( .Join(

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

@ -36,10 +36,10 @@ namespace Volo.CmsKit.Public.Blogs
{ {
var blog = await BlogRepository.GetBySlugAsync(blogSlug); var blog = await BlogRepository.GetBySlugAsync(blogSlug);
var blogPosts = await BlogPostRepository.GetPagedListAsync(blog.Id, input.SkipCount, input.MaxResultCount, input.Sorting); var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id,input.MaxResultCount, input.SkipCount, input.Sorting);
return new PagedResultDto<BlogPostPublicDto>( return new PagedResultDto<BlogPostPublicDto>(
await BlogPostRepository.GetCountAsync(blog.Id), await BlogPostRepository.GetCountAsync(blogId: blog.Id),
ObjectMapper.Map<List<BlogPost>, List<BlogPostPublicDto>>(blogPosts)); ObjectMapper.Map<List<BlogPost>, List<BlogPostPublicDto>>(blogPosts));
} }
} }

2
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs

@ -98,7 +98,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetListAsync_ShouldWorkProperly_WithDefaultParameters() public async Task GetListAsync_ShouldWorkProperly_WithDefaultParameters()
{ {
var list = await blogPostAdminAppService.GetListAsync(new PagedAndSortedResultRequestDto()); var list = await blogPostAdminAppService.GetListAsync(new BlogPostGetListInput());
list.ShouldNotBeNull(); list.ShouldNotBeNull();
list.TotalCount.ShouldBe(2); list.TotalCount.ShouldBe(2);

10
modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs

@ -97,7 +97,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithoutSorting() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); var result = await blogPostRepository.GetListAsync(null, testData.Blog_Id);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -107,7 +107,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldHaveAuthor_WithBlogId_WhileGetting10_WithoutSorting() public async Task GetPagedListAsync_ShouldHaveAuthor_WithBlogId_WhileGetting10_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); var result = await blogPostRepository.GetListAsync(null, testData.Blog_Id);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -119,7 +119,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1_WithoutSorting() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, default, 1, default); var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, maxResultCount: 1);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -129,7 +129,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1InPage2_WithoutSorting() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1InPage2_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 1, 1, default); var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, skipCount: 1, maxResultCount: 1);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -139,7 +139,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithSortingByTitle() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithSortingByTitle()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, default, 10, nameof(BlogPost.Title)); var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, sorting: $"{nameof(BlogPost.Title)} asc");
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();

Loading…
Cancel
Save