Skip to content

Commit 4fdc8ac

Browse files
committed
feat/#152: 리뷰 목록 조회 시 답변 완료 여부 필드 추가
1 parent 673f5f9 commit 4fdc8ac

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

src/main/java/com/example/nexus/app/review/dto/ReviewResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public class ReviewResponse {
1717
private String content;
1818
private LocalDateTime createdAt;
1919
private LocalDateTime updatedAt;
20+
// 답변 완료 여부
21+
private Boolean hasReply;
2022
// 작성자 정보 (내부 클래스로 구성)
2123
private WriterInfo writer;
2224

src/main/java/com/example/nexus/app/review/repository/ReviewReplyRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,8 @@ public interface ReviewReplyRepository extends JpaRepository<ReviewReply, Long>
3232
Page<ReviewReply> findByCreatedByOrderByCreatedAtDesc(@Param("userId") Long userId, Pageable pageable);
3333

3434
Long countByReviewId(Long reviewId);
35+
36+
@Query("SELECT rr.review.id, COUNT(rr) FROM ReviewReply rr WHERE rr.review.id IN :reviewIds GROUP BY rr.review.id")
37+
List<Object[]> countByReviewIds(@Param("reviewIds") List<Long> reviewIds);
3538
}
3639

src/main/java/com/example/nexus/app/review/service/ReviewService.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,31 @@ public ReviewResponse getReview(Long reviewId) {
104104

105105
@Transactional(readOnly = true)
106106
public List<ReviewResponse> getReviewsByPostId(Long postId) {
107-
return reviewRepository
108-
.findByPostId(postId)
109-
.stream()
110-
.map(this::toReviewResponse)
107+
List<Review> reviews = reviewRepository.findByPostId(postId);
108+
109+
List<Long> reviewIds = reviews.stream()
110+
.map(Review::getId)
111+
.collect(Collectors.toList());
112+
113+
// 리뷰 ID별 답글 개수 Map 생성
114+
java.util.Map<Long, Long> replyCountMap = java.util.Collections.emptyMap();
115+
if (!reviewIds.isEmpty()) {
116+
replyCountMap = reviewReplyRepository.countByReviewIds(reviewIds)
117+
.stream()
118+
.collect(Collectors.toMap(
119+
result -> ((Number) result[0]).longValue(),
120+
result -> ((Number) result[1]).longValue()
121+
));
122+
}
123+
124+
final java.util.Map<Long, Long> finalReplyCountMap = replyCountMap;
125+
126+
return reviews.stream()
127+
.map(review -> {
128+
boolean hasReply = finalReplyCountMap.containsKey(review.getId())
129+
&& finalReplyCountMap.get(review.getId()) > 0;
130+
return toReviewResponse(review, hasReply);
131+
})
111132
.collect(Collectors.toList());
112133
}
113134

@@ -239,6 +260,10 @@ public ReviewStatusResponse getReviewStatus(Long userId, Long postId) {
239260
}
240261

241262
private ReviewResponse toReviewResponse(Review review) {
263+
return toReviewResponse(review, false);
264+
}
265+
266+
private ReviewResponse toReviewResponse(Review review, boolean hasReply) {
242267
User createdBy = review.getCreatedBy();
243268

244269
return ReviewResponse.builder()
@@ -248,6 +273,7 @@ private ReviewResponse toReviewResponse(Review review) {
248273
.content(review.getContent())
249274
.createdAt(review.getCreatedAt())
250275
.updatedAt(review.getUpdatedAt())
276+
.hasReply(hasReply)
251277
.writer(ReviewResponse.WriterInfo.builder()
252278
.id(createdBy.getId())
253279
.nickname(createdBy.getNickname() != null ? createdBy.getNickname() : "")

0 commit comments

Comments
 (0)