diff --git a/src/main/java/com/aloc/aloc/course/repository/UserCourseRepository.java b/src/main/java/com/aloc/aloc/course/repository/UserCourseRepository.java index 0ccd0e19..a0f131c4 100644 --- a/src/main/java/com/aloc/aloc/course/repository/UserCourseRepository.java +++ b/src/main/java/com/aloc/aloc/course/repository/UserCourseRepository.java @@ -45,4 +45,17 @@ SELECT COUNT(uc) + 1 int findClearRank(@Param("course") Course course, @Param("updatedAt") LocalDateTime updatedAt); long countByUserCourseState(UserCourseState userCourseState); + + @Query( + """ + SELECT uc FROM UserCourse uc + WHERE uc.user = :user AND uc.course.id IN :courseIds + AND uc.createdAt = ( + SELECT MAX(uc2.createdAt) + FROM UserCourse uc2 + WHERE uc2.user = :user AND uc2.course.id = uc.course.id + ) + """) + List findLatestUserCoursesByUserAndCourseIds( + @Param("user") User user, @Param("courseIds") List courseIds); } diff --git a/src/main/java/com/aloc/aloc/course/service/UserCourseService.java b/src/main/java/com/aloc/aloc/course/service/UserCourseService.java index 97e32a7b..7c8c5e5f 100644 --- a/src/main/java/com/aloc/aloc/course/service/UserCourseService.java +++ b/src/main/java/com/aloc/aloc/course/service/UserCourseService.java @@ -14,7 +14,9 @@ import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.NoSuchElementException; +import java.util.stream.Collectors; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -127,4 +129,12 @@ public int getClearRank(UserCourse userCourse) { public long getUserCourseCountByUserCourseState(UserCourseState userCourseState) { return userCourseRepository.countByUserCourseState(userCourseState); } + + public Map getLatestUserCourseStates(User user, List courseIds) { + List latestUserCourses = + userCourseRepository.findLatestUserCoursesByUserAndCourseIds(user, courseIds); + + return latestUserCourses.stream() + .collect(Collectors.toMap(uc -> uc.getCourse().getId(), UserCourse::getUserCourseState)); + } } diff --git a/src/main/java/com/aloc/aloc/user/service/facade/UserFacade.java b/src/main/java/com/aloc/aloc/user/service/facade/UserFacade.java index 95300322..61fa90d8 100644 --- a/src/main/java/com/aloc/aloc/user/service/facade/UserFacade.java +++ b/src/main/java/com/aloc/aloc/user/service/facade/UserFacade.java @@ -276,25 +276,17 @@ public CourseUserResponseDto closeUserCourse(Long courseId, String oauthId) { public Page getCoursesByUser( Pageable pageable, String oauthId, CourseType courseTypeOrNull) { User user = userService.getUser(oauthId); - List userCourses = userCourseService.getUserCoursesByUser(user); Page courses = courseService.getCoursePageByCourseType(pageable, courseTypeOrNull); - Map latestUserCourseMap = - userCourses.stream() - .collect( - Collectors.groupingBy( - uc -> uc.getCourse().getId(), - Collectors.collectingAndThen( - Collectors.maxBy(Comparator.comparing(UserCourse::getCreatedAt)), - optional -> optional.orElse(null)))); + List courseIds = courses.getContent().stream().map(Course::getId).toList(); + + Map userCourseStateMap = + userCourseService.getLatestUserCourseStates(user, courseIds); return courses.map( course -> { - UserCourse latestUserCourse = latestUserCourseMap.get(course.getId()); UserCourseState state = - (latestUserCourse != null) - ? latestUserCourse.getUserCourseState() - : UserCourseState.NOT_STARTED; + userCourseStateMap.getOrDefault(course.getId(), UserCourseState.NOT_STARTED); return CourseResponseDto.of(course, state); }); }