diff --git a/src/main/java/com/example/koschool/domain/newsletter/NewsletterController.java b/src/main/java/com/example/koschool/domain/newsletter/NewsletterController.java index fd6cd7d..1eeb758 100644 --- a/src/main/java/com/example/koschool/domain/newsletter/NewsletterController.java +++ b/src/main/java/com/example/koschool/domain/newsletter/NewsletterController.java @@ -20,14 +20,45 @@ public class NewsletterController { private final NewsletterService newsletterService; + /** + * 메인 페이지 뉴스레터 핫토픽 목록 보기 + * @param category + * @return + */ @GetMapping("/list") - public ApiResponse> getNewsletterList(@RequestParam("category") String category, + public ApiResponse> getNewsletterList(@RequestParam("category") String category) { + return ApiResponse.of(HttpStatus.OK, newsletterService.getNewsletterList(category)); + } + + /** + * 더보기 페이지 뉴스레터 핫토픽 랭킹 보기 + * @param category + * @param date + * @return + */ + @GetMapping("/list/likes") + public ApiResponse> getNewsletterListWithLikes(@RequestParam("category") String category, @RequestParam("date") LocalDate date) { - return ApiResponse.of(HttpStatus.OK, newsletterService.getNewsLetterList(category, date)); + return ApiResponse.of(HttpStatus.OK, newsletterService.getNewsletterListWithLikes(category, date)); + } + + /** + * 더보기 페이지 이전 뉴스레터 목록 보기 + * @param category + * @return + */ + @GetMapping("/list/previous") + public ApiResponse> getNewsletterListPrevious(@RequestParam("category") String category) { + return ApiResponse.of(HttpStatus.OK, newsletterService.getNewsletterListPrevious(category)); } + /** + * 상세 페이지 뉴스레터 보기 + * @param newsletterId + * @return + */ @GetMapping("/detail") - public ApiResponse getNewsletter(@RequestParam("newsletterId") String newsletterId) { - return ApiResponse.of(HttpStatus.OK, newsletterService.getNewsLetter(newsletterId)); + public ApiResponse getNewsletterDetail(@RequestParam("newsletterId") Long newsletterId) { + return ApiResponse.of(HttpStatus.OK, newsletterService.getNewsLetterDetail(newsletterId)); } } diff --git a/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterListResponseDto.java b/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterListResponseDto.java index c963de9..cf5a8c1 100644 --- a/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterListResponseDto.java +++ b/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterListResponseDto.java @@ -1,18 +1,14 @@ package com.example.koschool.domain.newsletter.dto.response; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter +@AllArgsConstructor public class NewsletterListResponseDto { - private Long newsletterId; + private Long id; private String title; - @Builder - private NewsletterListResponseDto(Long newsletterId, String title) { - this.newsletterId = newsletterId; - this.title = title; - } - } diff --git a/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterResponseDto.java b/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterResponseDto.java index 14a8bf0..5c87796 100644 --- a/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterResponseDto.java +++ b/src/main/java/com/example/koschool/domain/newsletter/dto/response/NewsletterResponseDto.java @@ -1,25 +1,23 @@ package com.example.koschool.domain.newsletter.dto.response; import com.example.koschool.domain.newsletter.entity.Newsletter; -import java.util.Random; import lombok.Builder; import lombok.Getter; @Getter public class NewsletterResponseDto { + private String title; private String summary; private Integer likes; private String stock; private String link; - Random random = new Random(); - @Builder private NewsletterResponseDto(String title, String summary, Integer likes, String stock, String link) { this.title = title; this.summary = summary; - this.likes = random.nextInt(240)+11; + this.likes = likes; this.stock = stock; this.link = link; } diff --git a/src/main/java/com/example/koschool/domain/newsletter/repository/NewsletterRepository.java b/src/main/java/com/example/koschool/domain/newsletter/repository/NewsletterRepository.java index b061ba5..198a7db 100644 --- a/src/main/java/com/example/koschool/domain/newsletter/repository/NewsletterRepository.java +++ b/src/main/java/com/example/koschool/domain/newsletter/repository/NewsletterRepository.java @@ -5,15 +5,25 @@ import com.example.koschool.domain.newsletter.entity.Newsletter; import java.time.LocalDate; import java.util.List; +import java.util.Optional; +import javax.swing.text.html.Option; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface NewsletterRepository extends JpaRepository { - @Query("SELECT NEW com.example.koschool.domain.newsletter.dto.response.NewsletterListResponseDto(n.id, n.title)" - + "FROM Newsletter n " - + "WHERE n.category = :category AND n.date = :date") - List findByCategoryAndDate(String category, LocalDate date); + List findTop3ByCategoryOrderByIdDesc(String category); + + @Query("SELECT n FROM Newsletter n WHERE n.category = :category " + + "AND n.date BETWEEN :startDate AND :endDate ORDER BY n.likes DESC") + List findTop3ByCategoryAndDateBetweenOrderByLikesDesc(@Param("category") String category, + @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, Pageable pageable); + + List findAllByCategoryOrderByIdDesc(String category); + + Optional findById(Long id); } diff --git a/src/main/java/com/example/koschool/domain/newsletter/service/NewsletterService.java b/src/main/java/com/example/koschool/domain/newsletter/service/NewsletterService.java index 32ff4bc..dd7cdc5 100644 --- a/src/main/java/com/example/koschool/domain/newsletter/service/NewsletterService.java +++ b/src/main/java/com/example/koschool/domain/newsletter/service/NewsletterService.java @@ -9,7 +9,10 @@ import java.time.LocalDate; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,15 +23,32 @@ public class NewsletterService { private final NewsletterRepository newsletterRepository; - public List getNewsLetterList(String category, LocalDate date) { - return newsletterRepository.findByCategoryAndDate(category, date); + public List getNewsletterList(String category) { + List newsletters = newsletterRepository.findTop3ByCategoryOrderByIdDesc(category); + return newsletters.stream() + .map(newsletter -> new NewsletterListResponseDto(newsletter.getId(), newsletter.getTitle())) + .collect(Collectors.toList()); } - public NewsletterResponseDto getNewsLetter(String newsletterId) { - Optional newsletter = newsletterRepository.findById(newsletterId); - if(newsletter.isEmpty()){ - throw new CustomException(ErrorCode.NEWSLETTER_NOT_FOUND); - } - return NewsletterResponseDto.fromEntityToDto(newsletter.get()); + public List getNewsletterListWithLikes(String category, LocalDate date) { + Pageable pageable = PageRequest.of(0, 3); + List newsletters = newsletterRepository.findTop3ByCategoryAndDateBetweenOrderByLikesDesc( + category, date.minusMonths(1), date, pageable); + return newsletters.stream() + .map(newsletter -> new NewsletterListResponseDto(newsletter.getId(), newsletter.getTitle())) + .collect(Collectors.toList()); + } + + public List getNewsletterListPrevious(String category) { + List newsletters = newsletterRepository.findAllByCategoryOrderByIdDesc(category); + return newsletters.stream() + .map(newsletter -> new NewsletterListResponseDto(newsletter.getId(), newsletter.getTitle())) + .collect(Collectors.toList()); + } + + public NewsletterResponseDto getNewsLetterDetail(Long newsletterId) { + Newsletter newsletter = newsletterRepository.findById(newsletterId) + .orElseThrow(() -> new CustomException(ErrorCode.NEWSLETTER_NOT_FOUND)); + return NewsletterResponseDto.fromEntityToDto(newsletter); } }