From c65dfbcbf9abbe0ada1acd87f68d0d41ca0b7e2e Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:44:50 +0800 Subject: [PATCH] feat: show correct reply counts --- .../src/main/java/com/openisle/dto/PostSummaryDto.java | 1 + .../src/main/java/com/openisle/mapper/PostMapper.java | 1 + .../java/com/openisle/repository/CommentRepository.java | 3 +++ .../main/java/com/openisle/service/CommentService.java | 7 +++++++ frontend/src/views/HomePageView.vue | 9 ++++----- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/openisle/dto/PostSummaryDto.java b/backend/src/main/java/com/openisle/dto/PostSummaryDto.java index 079dc8c2d..02d2ad76d 100644 --- a/backend/src/main/java/com/openisle/dto/PostSummaryDto.java +++ b/backend/src/main/java/com/openisle/dto/PostSummaryDto.java @@ -19,6 +19,7 @@ public class PostSummaryDto { private CategoryDto category; private List tags; private long views; + private long commentCount; private PostStatus status; private LocalDateTime pinnedAt; private LocalDateTime lastReplyAt; diff --git a/backend/src/main/java/com/openisle/mapper/PostMapper.java b/backend/src/main/java/com/openisle/mapper/PostMapper.java index 8b5d36e0c..12eba57fb 100644 --- a/backend/src/main/java/com/openisle/mapper/PostMapper.java +++ b/backend/src/main/java/com/openisle/mapper/PostMapper.java @@ -58,6 +58,7 @@ public class PostMapper { dto.setCategory(categoryMapper.toDto(post.getCategory())); dto.setTags(post.getTags().stream().map(tagMapper::toDto).collect(Collectors.toList())); dto.setViews(post.getViews()); + dto.setCommentCount(commentService.countComments(post.getId())); dto.setStatus(post.getStatus()); dto.setPinnedAt(post.getPinnedAt()); diff --git a/backend/src/main/java/com/openisle/repository/CommentRepository.java b/backend/src/main/java/com/openisle/repository/CommentRepository.java index 12f20fecd..fa2418f58 100644 --- a/backend/src/main/java/com/openisle/repository/CommentRepository.java +++ b/backend/src/main/java/com/openisle/repository/CommentRepository.java @@ -27,4 +27,7 @@ public interface CommentRepository extends JpaRepository { @org.springframework.data.jpa.repository.Query("SELECT MAX(c.createdAt) FROM Comment c WHERE c.author.id = :userId") java.time.LocalDateTime findLastCommentTimeOfUserByUserId(@org.springframework.data.repository.query.Param("userId") Long userId); + @org.springframework.data.jpa.repository.Query("SELECT COUNT(c) FROM Comment c WHERE c.post.id = :postId") + long countByPostId(@org.springframework.data.repository.query.Param("postId") Long postId); + } diff --git a/backend/src/main/java/com/openisle/service/CommentService.java b/backend/src/main/java/com/openisle/service/CommentService.java index 96ed10f4e..95dd7b9d7 100644 --- a/backend/src/main/java/com/openisle/service/CommentService.java +++ b/backend/src/main/java/com/openisle/service/CommentService.java @@ -186,6 +186,13 @@ public class CommentService { return time; } + public long countComments(Long postId) { + log.debug("countComments called for post {}", postId); + long count = commentRepository.countByPostId(postId); + log.debug("countComments for post {} is {}", postId, count); + return count; + } + @Transactional public void deleteComment(String username, Long id) { log.debug("deleteComment called by user {} for comment {}", username, id); diff --git a/frontend/src/views/HomePageView.vue b/frontend/src/views/HomePageView.vue index 91e128dec..fed9fc0bf 100644 --- a/frontend/src/views/HomePageView.vue +++ b/frontend/src/views/HomePageView.vue @@ -175,8 +175,7 @@ export default { }) }) - const countComments = (list) => - list.reduce((sum, c) => sum + 1 + countComments(c.replies || []), 0) + // Backend now returns comment counts directly const loadOptions = async () => { if (selectedCategory.value && !isNaN(selectedCategory.value)) { @@ -267,7 +266,7 @@ export default { category: p.category, tags: p.tags || [], members: (p.participants || []).map(m => ({ id: m.id, avatar: m.avatar })), - comments: countComments(p.comments || []), + comments: p.commentCount, views: p.views, time: TimeManager.format(p.createdAt), pinned: !!p.pinnedAt @@ -304,7 +303,7 @@ export default { category: p.category, tags: p.tags || [], members: (p.participants || []).map(m => ({ id: m.id, avatar: m.avatar })), - comments: countComments(p.comments || []), + comments: p.commentCount, views: p.views, time: TimeManager.format(p.createdAt), pinned: !!p.pinnedAt @@ -341,7 +340,7 @@ export default { category: p.category, tags: p.tags || [], members: (p.participants || []).map(m => ({ id: m.id, avatar: m.avatar })), - comments: countComments(p.comments || []), + comments: p.commentCount, views: p.views, time: TimeManager.format(p.lastReplyAt || p.createdAt), pinned: !!p.pinnedAt