diff --git a/src/main/java/cc/ryanc/halo/model/vo/PostListVO.java b/src/main/java/cc/ryanc/halo/model/vo/PostListVO.java index adf588de7..8bc6d00e1 100644 --- a/src/main/java/cc/ryanc/halo/model/vo/PostListVO.java +++ b/src/main/java/cc/ryanc/halo/model/vo/PostListVO.java @@ -18,7 +18,10 @@ import java.util.List; @Data public class PostListVO extends PostSimpleOutputDTO { + private Long commentCount; + private List tags; private List categories; + } diff --git a/src/main/java/cc/ryanc/halo/repository/CommentRepository.java b/src/main/java/cc/ryanc/halo/repository/CommentRepository.java index 1364fd8c3..d348b1b4a 100644 --- a/src/main/java/cc/ryanc/halo/repository/CommentRepository.java +++ b/src/main/java/cc/ryanc/halo/repository/CommentRepository.java @@ -2,12 +2,16 @@ package cc.ryanc.halo.repository; import cc.ryanc.halo.model.entity.Comment; import cc.ryanc.halo.model.enums.CommentStatus; +import cc.ryanc.halo.model.projection.CommentCountProjection; import cc.ryanc.halo.repository.base.BaseRepository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; +import java.util.List; + /** * Comment repository. * @@ -25,4 +29,26 @@ public interface CommentRepository extends BaseRepository { */ @NonNull Page findAllByStatus(@Nullable CommentStatus status, @NonNull Pageable pageable); + + /** + * Finds all comments by post ids. + * + * @param postIds post ids must not be null + * @return a list of comment + */ + @NonNull + List findAllByPostIdIn(@NonNull Iterable postIds); + + /** + * Finds all comments by post id. + * + * @param postId post id must not be null + * @return a list of comment + */ + @NonNull + List findAllByPostId(@NonNull Integer postId); + + @Query("select new cc.ryanc.halo.model.projection.CommentCountProjection(count(comment.id), comment.postId) from Comment comment where comment.postId in ?1 group by comment.postId") + @NonNull + List countByPostIds(@NonNull Iterable postIds); } diff --git a/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java index 18bec7885..b4f1d95ab 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/CommentServiceImpl.java @@ -4,10 +4,11 @@ import cc.ryanc.halo.model.dto.post.PostMinimalOutputDTO; import cc.ryanc.halo.model.entity.Comment; import cc.ryanc.halo.model.entity.Post; import cc.ryanc.halo.model.enums.CommentStatus; +import cc.ryanc.halo.model.projection.CommentCountProjection; import cc.ryanc.halo.model.vo.CommentVO; import cc.ryanc.halo.repository.CommentRepository; +import cc.ryanc.halo.repository.PostRepository; import cc.ryanc.halo.service.CommentService; -import cc.ryanc.halo.service.PostService; import cc.ryanc.halo.service.base.AbstractCrudService; import cc.ryanc.halo.utils.ServiceUtils; import org.springframework.data.domain.*; @@ -17,10 +18,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -34,13 +32,13 @@ public class CommentServiceImpl extends AbstractCrudService imple private final CommentRepository commentRepository; - private final PostService postService; + private final PostRepository postRepository; public CommentServiceImpl(CommentRepository commentRepository, - PostService postService) { + PostRepository postRepository) { super(commentRepository); this.commentRepository = commentRepository; - this.postService = postService; + this.postRepository = postRepository; } @Override @@ -64,6 +62,25 @@ public class CommentServiceImpl extends AbstractCrudService imple return convertBy(commentPage); } + @Override + public List listBy(Integer postId) { + Assert.notNull(postId, "Post id must not be null"); + + return commentRepository.findAllByPostId(postId); + } + + @Override + public Map countByPostIds(Collection postIds) { + if (CollectionUtils.isEmpty(postIds)) { + return Collections.emptyMap(); + } + + // Get all comment counts + List commentCountProjections = commentRepository.countByPostIds(postIds); + + return ServiceUtils.convertToMap(commentCountProjections, CommentCountProjection::getPostId, CommentCountProjection::getCount); + } + /** * Converts to comment vo page. * @@ -93,7 +110,7 @@ public class CommentServiceImpl extends AbstractCrudService imple Set postIds = ServiceUtils.fetchProperty(comments, Comment::getPostId); // Get all posts - Map postMap = ServiceUtils.convertToMap(postService.listAllByIds(postIds), Post::getId); + Map postMap = ServiceUtils.convertToMap(postRepository.findAllById(postIds), Post::getId); return comments.stream().map(comment -> { // Convert to vo diff --git a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java index 6324160fe..cfe7b202c 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/PostServiceImpl.java @@ -62,37 +62,15 @@ public class PostServiceImpl extends AbstractCrudService implemen TagService tagService, CategoryService categoryService, PostTagService postTagService, - PostCategoryService postCategoryService) { + PostCategoryService postCategoryService, + CommentService commentService) { super(postRepository); this.postRepository = postRepository; this.tagService = tagService; this.categoryService = categoryService; this.postTagService = postTagService; this.postCategoryService = postCategoryService; - } - - /** - * Save post with tags and categories - * - * @param post post - * @param tags tags - * @param categories categories - * @return saved post - */ - @Override - public Post save(Post post, List tags, List categories) { - // TODO 保存文章以及对应标签和分类 - return null; - } - - /** - * Remove post and relationship - * - * @param id id - */ - @Override - public void remove(Integer id) { - // TODO 删除文章以及关联关系 + this.commentService = commentService; } @Override @@ -144,10 +122,16 @@ public class PostServiceImpl extends AbstractCrudService implemen Set postIds = ServiceUtils.fetchProperty(posts, Post::getId); + // Get tag list map Map> tagListMap = postTagService.listTagListMapBy(postIds); + // Get category list map Map> categoryListMap = postCategoryService.listCategoryListMap(postIds); + // Get comment count + Map commentCountMap = commentService.countByPostIds(postIds); + + return postPage.map(post -> { PostListVO postListVO = new PostListVO().convertFrom(post); @@ -159,6 +143,9 @@ public class PostServiceImpl extends AbstractCrudService implemen List categoryOutputDTOS = categoryListMap.get(post.getId()).stream().map(category -> (CategoryOutputDTO) new CategoryOutputDTO().convertFrom(category)).collect(Collectors.toList()); postListVO.setCategories(categoryOutputDTOS); + // Set comment count + postListVO.setCommentCount(commentCountMap.getOrDefault(post.getId(), 0L)); + return postListVO; }); }