From d1c6d7d30e69147b60518dcfa4edc91e4ac76bfd Mon Sep 17 00:00:00 2001 From: yunhacandy Date: Sat, 10 Aug 2024 22:53:20 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9B=90=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EA=B0=84=20=EB=8F=99=EC=95=88=20=EC=A0=80=EC=9E=A5=EB=90=9C=20?= =?UTF-8?q?=EC=88=8F=ED=8F=BC=EC=9D=98=20=EB=A9=94=EC=9D=B8=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=88=9C=EC=9C=84=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CategoryController.java | 15 +++++++++++++++ .../repository/CategoryRepository.java | 12 ++++++++++++ .../service/CategoryService.java | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/main/java/com/hongik/graduationproject/controller/CategoryController.java b/src/main/java/com/hongik/graduationproject/controller/CategoryController.java index 2315c86..5c8805c 100644 --- a/src/main/java/com/hongik/graduationproject/controller/CategoryController.java +++ b/src/main/java/com/hongik/graduationproject/controller/CategoryController.java @@ -1,5 +1,7 @@ package com.hongik.graduationproject.controller; +import java.util.Date; + import com.hongik.graduationproject.domain.dto.Response; import com.hongik.graduationproject.domain.dto.category.MainCategoryRankingListResponse; import com.hongik.graduationproject.domain.dto.category.SubCategoryCreateRequest; @@ -14,6 +16,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @@ -54,4 +57,16 @@ public Response getMainCategoryRanking(@Authent MainCategoryRankingListResponse rankingList = categoryService.getMainCategoryRanking(userId); return Response.createSuccess(rankingList); } + + @Operation(summary = "주차별 메인 카테고리 랭킹 가져오기", description = "특정 주차에 대한 메인 카테고리 1, 2위를 가져오는 메소드") + @ApiResponse(content = @Content(schema = @Schema(implementation = MainCategoryRankingListResponse.class))) + @ResponseStatus(HttpStatus.OK) + @GetMapping("/categories/rankings/weekly") + public Response getMainCategoryRankingByDate( + @AuthenticationPrincipal Long userId, + @RequestParam(name = "start-date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date startDate, + @RequestParam(name = "end-date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date endDate) { + MainCategoryRankingListResponse rankingList = categoryService.getMainCategoryRankingByDate(userId, startDate, endDate); + return Response.createSuccess(rankingList); + } } \ No newline at end of file diff --git a/src/main/java/com/hongik/graduationproject/repository/CategoryRepository.java b/src/main/java/com/hongik/graduationproject/repository/CategoryRepository.java index 55826bd..5a0d4d8 100644 --- a/src/main/java/com/hongik/graduationproject/repository/CategoryRepository.java +++ b/src/main/java/com/hongik/graduationproject/repository/CategoryRepository.java @@ -5,6 +5,7 @@ import com.hongik.graduationproject.domain.entity.Category; import com.hongik.graduationproject.domain.entity.User; import com.hongik.graduationproject.enums.MainCategory; +import java.util.Date; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -39,4 +40,15 @@ public interface CategoryRepository extends JpaRepository { "ORDER BY COUNT(vsc.video_summary_category_id) DESC " + "LIMIT 2", nativeQuery = true) List getSummaryCountOfMainCategoryByUser(Long userId); + + @Query(value = "SELECT c.main_category AS mainCategory, COUNT(vsc.video_summary_category_id) AS count " + + "FROM category c " + + "LEFT JOIN video_summary_category vsc ON c.category_id = vsc.category_id " + + "LEFT JOIN video_summary vs ON vsc.video_summary_id = vs.video_summary_id " + + "WHERE c.user_id = :userId " + + "AND vs.created_at BETWEEN :startDate AND :endDate "+ + "GROUP BY c.main_category " + + "ORDER BY COUNT(vsc.video_summary_category_id) DESC " + + "LIMIT 2", nativeQuery = true) + List getSummaryCountOfMainCategoryByUserAndDate(Long userId, Date startDate, Date endDate); } \ No newline at end of file diff --git a/src/main/java/com/hongik/graduationproject/service/CategoryService.java b/src/main/java/com/hongik/graduationproject/service/CategoryService.java index fb71217..2790979 100644 --- a/src/main/java/com/hongik/graduationproject/service/CategoryService.java +++ b/src/main/java/com/hongik/graduationproject/service/CategoryService.java @@ -12,6 +12,7 @@ import com.hongik.graduationproject.exception.ErrorCode; import com.hongik.graduationproject.repository.CategoryRepository; import com.hongik.graduationproject.repository.UserRepository; +import java.util.Date; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -76,6 +77,23 @@ public MainCategoryRankingListResponse getMainCategoryRanking(Long userId) { return new MainCategoryRankingListResponse(rankingList); } + @Transactional + public MainCategoryRankingListResponse getMainCategoryRankingByDate(Long userId, Date startDate, Date endDate) { + List categoryCounts = categoryRepository.getSummaryCountOfMainCategoryByUserAndDate(userId, startDate, endDate); + + int totalSummaries = categoryCounts.stream() + .mapToInt(count -> count.getCount().intValue()) + .sum(); + + List rankingList = categoryCounts.stream() + .map(count -> createRankingResponse(count, totalSummaries)) + .filter(ranking -> ranking.summaryCount() > 0) + .collect(Collectors.toList()); + + log.info("사용자 ID {}의 {}부터 {}까지의 메인 카테고리 순위 조회", userId, startDate, endDate); + return new MainCategoryRankingListResponse(rankingList); + } + private MainCategoryRankingResponse createRankingResponse(MainCategoryCount count, int totalSummaries) { MainCategory mainCategory = MainCategory.valueOf(count.getMainCategory()); int summaryCount = count.getCount().intValue();