11package com .daramg .server .post .application ;
22
3+ import com .daramg .server .comment .domain .Comment ;
4+ import com .daramg .server .comment .domain .CommentLike ;
5+ import com .daramg .server .comment .dto .CommentResponseDto ;
6+ import com .daramg .server .comment .repository .CommentLikeRepository ;
7+ import com .daramg .server .comment .repository .CommentRepository ;
38import com .daramg .server .common .application .EntityUtils ;
9+ import com .daramg .server .common .domain .BaseEntity ;
410import com .daramg .server .common .dto .PageRequestDto ;
511import com .daramg .server .common .dto .PageResponseDto ;
612import com .daramg .server .common .util .PagingUtils ;
2228import org .springframework .stereotype .Service ;
2329import org .springframework .transaction .annotation .Transactional ;
2430
25- import java .util .List ;
26- import java .util .Set ;
31+ import java .util .* ;
32+ import java .util .stream . Collectors ;
2733
2834@ Service
2935@ RequiredArgsConstructor
@@ -36,6 +42,8 @@ public class PostQueryService {
3642 private final PagingUtils pagingUtils ;
3743 private final EntityUtils entityUtils ;
3844 private final ComposerLikeRepository composerLikeRepository ;
45+ private final CommentRepository commentRepository ;
46+ private final CommentLikeRepository commentLikeRepository ;
3947
4048 public PageResponseDto <PostResponseDto > getAllPublishedFreePosts (PageRequestDto pageRequest , User user ){
4149 List <FreePost > posts = postQueryRepository .getAllFreePostsWithPaging (pageRequest );
@@ -113,7 +121,11 @@ public PostDetailResponse getPostById(Long postId, User user) {
113121 Post post = entityUtils .getEntity (postId , Post .class );
114122 Boolean isLiked = user != null ? postLikeRepository .existsByPostIdAndUserId (postId , user .getId ()) : null ;
115123 Boolean isScrapped = user != null ? postScrapRepository .existsByPostIdAndUserId (postId , user .getId ()) : null ;
116- return PostDetailResponse .from (post , isLiked , isScrapped );
124+ List <Comment > comments = commentRepository .findByPostIdAndIsBlockedFalseOrderByCreatedAtAsc (postId );
125+
126+ List <CommentResponseDto > commentDtos = mapCommentsWithChildren (comments , user );
127+
128+ return PostDetailResponse .from (post , isLiked , isScrapped , commentDtos );
117129 }
118130
119131 public ComposerWithPostsResponseDto getComposerWithPosts (Long composerId , PageRequestDto pageRequest , User user ) {
@@ -164,17 +176,72 @@ private PostResponseDto toPostResponseDto(Post post, User user, Set<Long> likedP
164176
165177 private Set <Long > getLikedPostIds (List <Post > posts , User user ) {
166178 if (user == null || posts .isEmpty ()) {
167- return java . util . Collections .emptySet ();
179+ return Collections .emptySet ();
168180 }
169181 List <Long > postIds = posts .stream ().map (Post ::getId ).toList ();
170182 return postLikeRepository .findPostIdsByPostIdsAndUserId (postIds , user .getId ());
171183 }
172184
173185 private Set <Long > getScrappedPostIds (List <Post > posts , User user ) {
174186 if (user == null || posts .isEmpty ()) {
175- return java . util . Collections .emptySet ();
187+ return Collections .emptySet ();
176188 }
177189 List <Long > postIds = posts .stream ().map (Post ::getId ).toList ();
178190 return postScrapRepository .findPostIdsByPostIdsAndUserId (postIds , user .getId ());
179191 }
192+
193+ private List <CommentResponseDto > mapCommentsWithChildren (List <Comment > allComments , User user ) {
194+ if (allComments .isEmpty ()) {
195+ return List .of ();
196+ }
197+
198+ // 부모/자식 댓글 분리 (작성시간 오름차순 정렬)
199+ List <Comment > parentComments = allComments .stream ()
200+ .filter (comment -> comment .getParentComment () == null )
201+ .sorted (Comparator .comparing ((Comment c ) -> c .getCreatedAt ()).thenComparingLong (BaseEntity ::getId ))
202+ .toList ();
203+
204+ Map <Long , List <Comment >> childrenByParentId = allComments .stream ()
205+ .filter (comment -> comment .getParentComment () != null )
206+ .collect (Collectors .groupingBy (comment -> comment .getParentComment ().getId ()));
207+
208+ // 현재 로그인 유저가 좋아요한 댓글 ID 모음
209+ Set <Long > likedCommentIds = getLikedCommentIds (allComments , user );
210+
211+ return parentComments .stream ()
212+ .map (parent -> {
213+ List <Comment > children = childrenByParentId .getOrDefault (parent .getId (), List .of ())
214+ .stream ()
215+ .sorted (Comparator .comparing ((Comment c ) -> c .getCreatedAt ()).thenComparingLong (BaseEntity ::getId ))
216+ .toList ();
217+
218+ List <CommentResponseDto .ChildCommentResponseDto > childDtos = children .stream ()
219+ .map (child -> CommentResponseDto .ChildCommentResponseDto .from (
220+ child ,
221+ user != null && likedCommentIds .contains (child .getId ())
222+ ))
223+ .toList ();
224+
225+ Boolean isParentLiked = user != null ? likedCommentIds .contains (parent .getId ()) : null ;
226+
227+ return CommentResponseDto .from (parent , isParentLiked , childDtos );
228+ })
229+ .toList ();
230+ }
231+
232+ private Set <Long > getLikedCommentIds (List <Comment > comments , User user ) {
233+ if (user == null || comments .isEmpty ()) {
234+ return Collections .emptySet ();
235+ }
236+
237+ List <Long > commentIds = comments .stream ()
238+ .map (Comment ::getId )
239+ .toList ();
240+
241+ List <CommentLike > likes = commentLikeRepository .findByCommentIdInAndUserId (commentIds , user .getId ());
242+
243+ return likes .stream ()
244+ .map (like -> like .getComment ().getId ())
245+ .collect (Collectors .toSet ());
246+ }
180247}
0 commit comments