diff --git a/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java b/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java index b12a6533..16247f33 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java +++ b/dateroad-api/src/main/java/org/dateroad/course/api/CourseController.java @@ -37,6 +37,12 @@ public ResponseEntity getAllCourse( return ResponseEntity.ok(courseAll); } + @GetMapping("/sort") + public ResponseEntity getSortedCourses(final @RequestParam String sortBy) { + CourseGetAllRes courseSortedRes = courseService.getSortedCourses(sortBy); + return ResponseEntity.ok(courseSortedRes); + } + @GetMapping("/date-access") public ResponseEntity getAllDataAccesCourse( final @UserId Long userId diff --git a/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java b/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java index 765ada1a..ab4e0d94 100644 --- a/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java +++ b/dateroad-api/src/main/java/org/dateroad/course/service/CourseService.java @@ -20,7 +20,6 @@ import org.dateroad.date.repository.CourseRepository; import org.dateroad.dateAccess.domain.DateAccess; import org.dateroad.dateAccess.repository.DateAccessRepository; -import org.dateroad.exception.DateRoadException; import org.dateroad.exception.EntityNotFoundException; import org.dateroad.image.domain.Image; import org.dateroad.image.repository.ImageRepository; @@ -35,6 +34,8 @@ import org.dateroad.tag.repository.CourseTagRepository; import org.dateroad.user.domain.User; import org.dateroad.user.repository.UserRepository; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -62,6 +63,18 @@ public CourseGetAllRes getAllCourses(final CourseGetAllReq courseGetAllReq) { return CourseGetAllRes.of(courseDtoGetResList); } + public CourseGetAllRes getSortedCourses(String sortBy) { + List courses; + if (sortBy.equalsIgnoreCase("POPULAR")) { + courses = getCoursesSortedByLikes(); + } else if (sortBy.equalsIgnoreCase("LATEST")) { + courses = getCoursesSortedByLatest(); + } else { + throw new EntityNotFoundException(FailureCode.SORT_TYPE_NOT_FOUND); + } + List courseDtoGetResList = convertToDtoList(courses, Function.identity()); + return CourseGetAllRes.of(courseDtoGetResList); + } @Transactional public void createCourseLike(final Long userId, final Long courseId) { @@ -79,6 +92,16 @@ public void deleteCourseLike(Long userId, Long courseId) { likeRepository.delete(findLike); } + public List getCoursesSortedByLikes() { + Pageable pageable = PageRequest.of(0, 5); + return courseRepository.findTopCoursesByLikes(pageable); + } + + public List getCoursesSortedByLatest() { + Pageable pageable = PageRequest.of(0, 3); + return courseRepository.findTopCoursesByCreatedAt(pageable); + } + private List convertToDtoList(final List entities, final Function converter) { return entities.stream() .map(converter) @@ -173,7 +196,7 @@ private CoursePaymentType validateUserFreeOrPoint(final User user, final int req if (user.getFree() > 0) { return CoursePaymentType.FREE; // User가 free를 갖고 있으면 true를 반환 } else if (user.getTotalPoint() < requiredPoints) { - throw new DateRoadException(FailureCode.INSUFFICIENT_USER_POINTS); + throw new EntityNotFoundException(FailureCode.INSUFFICIENT_USER_POINTS); } return CoursePaymentType.POINT; } diff --git a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java index 58c30f53..10b85b33 100644 --- a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java +++ b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java @@ -62,9 +62,10 @@ public enum FailureCode { COURSE_TAG_NOT_FOUND(HttpStatus.NOT_FOUND, "e40410", "데이트 태그를 찾을 수 없습니다."), NEAREST_DATE_NOT_FOUND(HttpStatus.NOT_FOUND, "e40411", "다가오는 데이트를 찾을 수 없습니다."), LIKE_NOT_FOUND(HttpStatus.NOT_FOUND, "e40412", "해당 데이트 코스에 좋아요를 찾을 수 없습니다."), - ADVERTISMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "e40413", "해당 광고를 찾을 수 없습니다."), + INSUFFICIENT_USER_POINTS(HttpStatus.NOT_FOUND, "e40413", "유저의 포인트가 부족합니다."), + SORT_TYPE_NOT_FOUND(HttpStatus.UNAUTHORIZED, "e40414", "해당 순서 타입을 찾을 수 없습니다."), + ADVERTISMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "e40415", "해당 광고를 찾을 수 없습니다."), - INSUFFICIENT_USER_POINTS(HttpStatus.NOT_FOUND, "e4048", "유저의 포인트가 부족합니다."), /** * 405 Method Not Allowed */ diff --git a/dateroad-domain/src/main/java/org/dateroad/date/repository/CourseRepository.java b/dateroad-domain/src/main/java/org/dateroad/date/repository/CourseRepository.java index 97a00821..1c20163d 100644 --- a/dateroad-domain/src/main/java/org/dateroad/date/repository/CourseRepository.java +++ b/dateroad-domain/src/main/java/org/dateroad/date/repository/CourseRepository.java @@ -1,18 +1,20 @@ package org.dateroad.date.repository; import java.util.List; -import java.util.Optional; import org.dateroad.date.domain.Course; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -// CourseRepository.java @Repository public interface CourseRepository extends JpaRepository , JpaSpecificationExecutor { boolean existsByUserId(Long userId); - + @Query("SELECT c FROM Course c LEFT JOIN Like l ON c.id = l.course.id GROUP BY c.id ORDER BY COUNT(l) DESC") + List findTopCoursesByLikes(Pageable pageable); + @Query("SELECT c FROM Course c ORDER BY c.createdAt DESC") + List findTopCoursesByCreatedAt(Pageable pageable); }