@ -4,6 +4,8 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Dtos ;
using System.Collections.Generic ;
using Microsoft.AspNetCore.Authorization ;
using Microsoft.Extensions.Caching.Distributed ;
using Volo.Abp.Caching ;
using Volo.Blogging.Comments ;
using Volo.Blogging.Tagging ;
using Volo.Blogging.Tagging.Dtos ;
@ -18,71 +20,41 @@ namespace Volo.Blogging.Posts
private readonly IPostRepository _postRepository ;
private readonly ITagRepository _tagRepository ;
private readonly ICommentRepository _commentRepository ;
private readonly IDistributedCache < ListResultDto < PostWithDetailsDto > > _postsCache ;
public PostAppService ( IPostRepository postRepository , ITagRepository tagRepository , ICommentRepository commentRepository , IBlogUserLookupService userLookupService )
public PostAppService ( IPostRepository postRepository , ITagRepository tagRepository , ICommentRepository commentRepository , IBlogUserLookupService userLookupService , IDistributedCache < ListResultDto < PostWithDetailsDto > > postsCache )
{
UserLookupService = userLookupService ;
_postRepository = postRepository ;
_tagRepository = tagRepository ;
_commentRepository = commentRepository ;
_postsCache = postsCache ;
}
public async Task < ListResultDto < PostWithDetailsDto > > GetListByBlogIdAndTagName ( Guid id , string tagName )
{
var posts = await _postRepository . GetPostsByBlogId ( id ) ;
var tag = tagName . IsNullOrWhiteSpace ( ) ? null : await _tagRepository . FindByNameAsync ( id , tagName ) ;
var userDictionary = new Dictionary < Guid , BlogUserDto > ( ) ;
var postDtos = new List < PostWithDetailsDto > ( ObjectMapper . Map < List < Post > , List < PostWithDetailsDto > > ( posts ) ) ;
foreach ( var postDto in postDtos )
{
postDto . Tags = await GetTagsOfPost ( postDto . Id ) ;
}
if ( tag ! = null )
{
postDtos = await FilterPostsByTag ( postDtos , tag ) ;
}
foreach ( var postDto in postDtos )
{
if ( postDto . CreatorId . HasValue )
var cacheKey = id . ToString ( ) + "-" + tagName ;
return await _postsCache . GetOrAddAsync (
cacheKey ,
async ( ) = > await GetPostsByBlogIdAndTagName ( id , tagName ) ,
( ) = > new DistributedCacheEntryOptions
{
if ( ! userDictionary . ContainsKey ( postDto . CreatorId . Value ) )
{
var creatorUser = await UserLookupService . FindByIdAsync ( postDto . CreatorId . Value ) ;
if ( creatorUser ! = null )
{
userDictionary [ creatorUser . Id ] = ObjectMapper . Map < BlogUser , BlogUserDto > ( creatorUser ) ;
}
}
if ( userDictionary . ContainsKey ( postDto . CreatorId . Value ) )
{
postDto . Writer = userDictionary [ ( Guid ) postDto . CreatorId ] ;
}
AbsoluteExpiration = DateTimeOffset . Now . AddHours ( 6 )
}
}
return new ListResultDto < PostWithDetailsDto > ( postDtos ) ;
) ;
}
public async Task < ListResultDto < PostWithDetailsDto > > GetTimeOrderedListAsync ( Guid blogId )
{
var posts = await _postRepository . GetOrderedList ( blogId ) ;
var postDtos = new List < PostWithDetailsDto > ( ObjectMapper . Map < List < Post > , List < PostWithDetailsDto > > ( posts ) ) ;
foreach ( var postDto in postDtos )
{
var creatorUser = await UserLookupService . FindByIdAsync ( postDto . CreatorId . Value ) ;
if ( creatorUser ! = null )
return await _postsCache . GetOrAddAsync (
blogId . ToString ( ) ,
async ( ) = > await GetTimeOrderedPostsAsync ( blogId ) ,
( ) = > new DistributedCacheEntryOptions
{
postDto. Writer = ObjectMapper . Map < BlogUser , BlogUserDto > ( creatorUser ) ;
AbsoluteExpiration = DateTimeOffset . Now . AddHours ( 6 )
}
}
return new ListResultDto < PostWithDetailsDto > ( postDtos ) ;
) ;
}
public async Task < PostWithDetailsDto > GetForReadingAsync ( GetPostInput input )
@ -185,6 +157,64 @@ namespace Volo.Blogging.Posts
return ObjectMapper . Map < Post , PostWithDetailsDto > ( post ) ;
}
private async Task < ListResultDto < PostWithDetailsDto > > GetPostsByBlogIdAndTagName ( Guid id , string tagName )
{
var posts = await _postRepository . GetPostsByBlogId ( id ) ;
var tag = tagName . IsNullOrWhiteSpace ( ) ? null : await _tagRepository . FindByNameAsync ( id , tagName ) ;
var userDictionary = new Dictionary < Guid , BlogUserDto > ( ) ;
var postDtos = new List < PostWithDetailsDto > ( ObjectMapper . Map < List < Post > , List < PostWithDetailsDto > > ( posts ) ) ;
foreach ( var postDto in postDtos )
{
postDto . Tags = await GetTagsOfPost ( postDto . Id ) ;
}
if ( tag ! = null )
{
postDtos = await FilterPostsByTag ( postDtos , tag ) ;
}
foreach ( var postDto in postDtos )
{
if ( postDto . CreatorId . HasValue )
{
if ( ! userDictionary . ContainsKey ( postDto . CreatorId . Value ) )
{
var creatorUser = await UserLookupService . FindByIdAsync ( postDto . CreatorId . Value ) ;
if ( creatorUser ! = null )
{
userDictionary [ creatorUser . Id ] = ObjectMapper . Map < BlogUser , BlogUserDto > ( creatorUser ) ;
}
}
if ( userDictionary . ContainsKey ( postDto . CreatorId . Value ) )
{
postDto . Writer = userDictionary [ ( Guid ) postDto . CreatorId ] ;
}
}
}
return new ListResultDto < PostWithDetailsDto > ( postDtos ) ;
}
private async Task < ListResultDto < PostWithDetailsDto > > GetTimeOrderedPostsAsync ( Guid blogId )
{
var posts = await _postRepository . GetOrderedList ( blogId ) ;
var postDtos = new List < PostWithDetailsDto > ( ObjectMapper . Map < List < Post > , List < PostWithDetailsDto > > ( posts ) ) ;
foreach ( var postDto in postDtos )
{
var creatorUser = await UserLookupService . FindByIdAsync ( postDto . CreatorId . Value ) ;
if ( creatorUser ! = null )
{
postDto . Writer = ObjectMapper . Map < BlogUser , BlogUserDto > ( creatorUser ) ;
}
}
return new ListResultDto < PostWithDetailsDto > ( postDtos ) ;
}
private async Task < string > RenameUrlIfItAlreadyExistAsync ( Guid blogId , string url , Post existingPost = null )
{
if ( await _postRepository . IsPostUrlInUseAsync ( blogId , url , existingPost ? . Id ) )