diff --git a/backend/src/main/java/wooteco/prolog/roadmap/application/RoadMapService.java b/backend/src/main/java/wooteco/prolog/roadmap/application/RoadMapService.java index bfa7b5be8..9e01f8676 100644 --- a/backend/src/main/java/wooteco/prolog/roadmap/application/RoadMapService.java +++ b/backend/src/main/java/wooteco/prolog/roadmap/application/RoadMapService.java @@ -6,6 +6,7 @@ import wooteco.prolog.common.exception.BadRequestException; import wooteco.prolog.roadmap.application.dto.KeywordResponse; import wooteco.prolog.roadmap.application.dto.KeywordsResponse; +import wooteco.prolog.roadmap.application.dto.RecommendedPostResponse; import wooteco.prolog.roadmap.domain.Curriculum; import wooteco.prolog.roadmap.domain.EssayAnswer; import wooteco.prolog.roadmap.domain.Keyword; @@ -20,8 +21,10 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; import static wooteco.prolog.common.exception.BadRequestCode.CURRICULUM_NOT_FOUND_EXCEPTION; @RequiredArgsConstructor @@ -40,41 +43,49 @@ public KeywordsResponse findAllKeywordsWithProgress(final Long curriculumId, fin final Curriculum curriculum = curriculumRepository.findById(curriculumId) .orElseThrow(() -> new BadRequestException(CURRICULUM_NOT_FOUND_EXCEPTION)); - final Set sessionIds = sessionRepository.findAllByCurriculumId(curriculum.getId()) - .stream() - .map(Session::getId) - .collect(Collectors.toSet()); + final List keywordsInCurriculum = getKeywordsInCurriculum(curriculum); - final List keywords = keywordRepository.findBySessionIdIn(sessionIds); + final Map> quizzesInKeywords = quizRepository.findAll().stream() + .collect(groupingBy(Quiz::getKeyword, toSet())); - final Set doneQuizzes = essayAnswerRepository.findAllByMemberId(memberId).stream() + return createResponsesWithProgress(keywordsInCurriculum, quizzesInKeywords, getDoneQuizzes(memberId)); + } + + private Set getDoneQuizzes(final Long memberId) { + return essayAnswerRepository.findAllByMemberId(memberId).stream() .map(EssayAnswer::getQuiz) - .collect(Collectors.toSet()); + .collect(toSet()); + } - final Map> quizzesPerKeyword = quizRepository.findAll().stream() - .collect(Collectors.groupingBy(Quiz::getKeyword, Collectors.toSet())); + private List getKeywordsInCurriculum(final Curriculum curriculum) { + final Set sessionIds = sessionRepository.findAllByCurriculumId(curriculum.getId()) + .stream() + .map(Session::getId) + .collect(toSet()); - return createWithProgress(keywords, quizzesPerKeyword, doneQuizzes); + return keywordRepository.findBySessionIdIn(sessionIds); } - private KeywordsResponse createWithProgress(final List keywords, - final Map> quizzesPerKeyword, - final Set doneQuizzes) { + private KeywordsResponse createResponsesWithProgress(final List keywords, + final Map> quizzesPerKeyword, + final Set doneQuizzes) { final List keywordResponses = keywords.stream() .filter(Keyword::isRoot) - .map(keyword -> createWithProgress(keyword, quizzesPerKeyword, doneQuizzes)) - .collect(Collectors.toList()); + .map(keyword -> createResponseWithProgress(keyword, quizzesPerKeyword, doneQuizzes)) + .collect(toList()); return new KeywordsResponse(keywordResponses); } - private KeywordResponse createWithProgress(final Keyword keyword, - final Map> quizzesPerKeyword, - final Set doneQuizzes) { + private KeywordResponse createResponseWithProgress(final Keyword keyword, + final Map> quizzesPerKeyword, + final Set doneQuizzes) { final int totalQuizCount = quizzesPerKeyword.get(keyword).size(); - final Set quizzes = quizzesPerKeyword.get(keyword); - quizzes.retainAll(doneQuizzes); - final int doneQuizCount = quizzes.size(); + final int doneQuizCount = getDoneQuizCount(quizzesPerKeyword.get(keyword), doneQuizzes); + + final List recommendedPostResponses = keyword.getRecommendedPosts().stream() + .map(RecommendedPostResponse::from) + .collect(toList()); return new KeywordResponse( keyword.getId(), @@ -85,15 +96,21 @@ private KeywordResponse createWithProgress(final Keyword keyword, totalQuizCount, doneQuizCount, keyword.getParentIdOrNull(), + recommendedPostResponses, createChildrenWithProgress(keyword.getChildren(), quizzesPerKeyword, doneQuizzes) ); } + private int getDoneQuizCount(final Set quizzes, final Set doneQuizzes) { + quizzes.retainAll(doneQuizzes); + return quizzes.size(); + } + private Set createChildrenWithProgress(final Set children, final Map> quizzesPerKeyword, final Set userAnswers) { return children.stream() - .map(child -> createWithProgress(child, quizzesPerKeyword, userAnswers)) - .collect(Collectors.toSet()); + .map(child -> createResponseWithProgress(child, quizzesPerKeyword, userAnswers)) + .collect(toSet()); } } diff --git a/backend/src/main/java/wooteco/prolog/roadmap/domain/repository/EssayAnswerRepository.java b/backend/src/main/java/wooteco/prolog/roadmap/domain/repository/EssayAnswerRepository.java index 4a0156606..3e2a962f6 100644 --- a/backend/src/main/java/wooteco/prolog/roadmap/domain/repository/EssayAnswerRepository.java +++ b/backend/src/main/java/wooteco/prolog/roadmap/domain/repository/EssayAnswerRepository.java @@ -19,7 +19,6 @@ public interface EssayAnswerRepository extends JpaRepository, @Query("SELECT e FROM EssayAnswer e " + "LEFT JOIN FETCH e.quiz q " + - "LEFT JOIN FETCH q.keyword " + "WHERE e.member.id = :memberId") Set findAllByMemberId(@Param("memberId") Long memberId); }