package io.spring.application; import io.spring.application.data.CommentData; import io.spring.core.user.User; import io.spring.infrastructure.mybatis.readservice.CommentReadService; import io.spring.infrastructure.mybatis.readservice.UserRelationshipQueryService; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.springframework.stereotype.Service; @Service public class CommentQueryService { private CommentReadService commentReadService; private UserRelationshipQueryService userRelationshipQueryService; public CommentQueryService( CommentReadService commentReadService, UserRelationshipQueryService userRelationshipQueryService) { this.commentReadService = commentReadService; this.userRelationshipQueryService = userRelationshipQueryService; } public Optional findById(String id, User user) { CommentData commentData = commentReadService.findById(id); if (commentData == null) { return Optional.empty(); } else { commentData .getProfileData() .setFollowing( userRelationshipQueryService.isUserFollowing( user.getId(), commentData.getProfileData().getId())); } return Optional.ofNullable(commentData); } public List findByArticleId(String articleId, User user) { List comments = commentReadService.findByArticleId(articleId); if (comments.size() > 0 && user != null) { Set followingAuthors = userRelationshipQueryService.followingAuthors( user.getId(), comments.stream() .map(commentData -> commentData.getProfileData().getId()) .collect(Collectors.toList())); comments.forEach( commentData -> { if (followingAuthors.contains(commentData.getProfileData().getId())) { commentData.getProfileData().setFollowing(true); } }); } return comments; } public CursorPager findByArticleIdWithCursor( String articleId, User user, CursorPageParameter page) { List comments = commentReadService.findByArticleIdWithCursor(articleId, page); if (comments.isEmpty()) { return new CursorPager<>(new ArrayList<>(), page.getDirection(), false); } if (user != null) { Set followingAuthors = userRelationshipQueryService.followingAuthors( user.getId(), comments.stream() .map(commentData -> commentData.getProfileData().getId()) .collect(Collectors.toList())); comments.forEach( commentData -> { if (followingAuthors.contains(commentData.getProfileData().getId())) { commentData.getProfileData().setFollowing(true); } }); } boolean hasExtra = comments.size() > page.getLimit(); if (hasExtra) { comments.remove(page.getLimit()); } if (!page.isNext()) { Collections.reverse(comments); } return new CursorPager<>(comments, page.getDirection(), hasExtra); } }