From 37ccaf9039032e45782ddb89d0ee6683db808620 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Tue, 10 Sep 2024 22:03:54 +0900 Subject: [PATCH 01/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=A2=85=ED=95=A9?= =?UTF-8?q?=EB=9E=AD=ED=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/RankingCommandService.kt | 12 ++++ .../service/RankingQueryService.kt | 10 ++++ .../presentation/api/RankingController.kt | 7 +++ .../spec/RankingControllerSpec.kt | 29 +++++++++ .../ranking/utils/RankingConstans.kt | 2 + .../repository/FoodSpotsReviewRepository.kt | 59 +++++++++++++++++++ .../service/RankingCommandServiceTest.kt | 28 +++++++++ .../service/RankingQueryServiceTest.kt | 33 +++++++++++ .../presentation/api/RankingControllerTest.kt | 26 ++++++++ .../FoodSpotsReviewRepositoryTest.kt | 16 +++++ 10 files changed, 222 insertions(+) diff --git a/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandService.kt b/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandService.kt index e832effc..9db5a48c 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandService.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandService.kt @@ -8,6 +8,8 @@ import kr.weit.roadyfoody.ranking.utils.REPORT_RANKING_KEY import kr.weit.roadyfoody.ranking.utils.REPORT_RANKING_UPDATE_LOCK import kr.weit.roadyfoody.ranking.utils.REVIEW_RANKING_KEY import kr.weit.roadyfoody.ranking.utils.REVIEW_RANKING_UPDATE_LOCK +import kr.weit.roadyfoody.ranking.utils.TOTAL_RANKING_KEY +import kr.weit.roadyfoody.ranking.utils.TOTAL_RANKING_UPDATE_LOCK import kr.weit.roadyfoody.review.repository.FoodSpotsReviewRepository import org.redisson.api.RLock import org.redisson.api.RedissonClient @@ -54,6 +56,16 @@ class RankingCommandService( ) } + @Async("asyncTask") + @Scheduled(cron = "0 0 5 * * *") + fun updateTotalRanking() { + updateRanking( + lockName = TOTAL_RANKING_UPDATE_LOCK, + key = TOTAL_RANKING_KEY, + dataProvider = reviewRepository::findAllUserTotalCount, + ) + } + fun updateRanking( lockName: String, key: String, diff --git a/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt b/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt index bc23f22c..4df27afd 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt @@ -9,6 +9,8 @@ import kr.weit.roadyfoody.ranking.utils.REPORT_RANKING_KEY import kr.weit.roadyfoody.ranking.utils.REPORT_RANKING_UPDATE_LOCK import kr.weit.roadyfoody.ranking.utils.REVIEW_RANKING_KEY import kr.weit.roadyfoody.ranking.utils.REVIEW_RANKING_UPDATE_LOCK +import kr.weit.roadyfoody.ranking.utils.TOTAL_RANKING_KEY +import kr.weit.roadyfoody.ranking.utils.TOTAL_RANKING_UPDATE_LOCK import kr.weit.roadyfoody.review.repository.FoodSpotsReviewRepository import org.springframework.data.redis.core.RedisTemplate import org.springframework.stereotype.Service @@ -45,6 +47,14 @@ class RankingQueryService( dataProvider = reviewRepository::findAllUserLikeCount, ) + fun getTotalRanking(size: Long): List = + getRanking( + lockName = TOTAL_RANKING_UPDATE_LOCK, + size = size, + key = TOTAL_RANKING_KEY, + dataProvider = reviewRepository::findAllUserTotalCount, + ) + private fun getRanking( lockName: String, size: Long, diff --git a/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingController.kt b/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingController.kt index f26a1713..94722faa 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingController.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingController.kt @@ -34,4 +34,11 @@ class RankingController( @RequestParam(defaultValue = "10") size: Long, ): List = rankingQueryService.getLikeRanking(size) + + @GetMapping("total") + override fun getTotalRanking( + @Positive(message = "size는 양수여야 합니다") + @RequestParam(defaultValue = "10") + size: Long, + ): List = rankingQueryService.getTotalRanking(size) } diff --git a/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/spec/RankingControllerSpec.kt b/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/spec/RankingControllerSpec.kt index 25bdad71..55b53e5f 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/spec/RankingControllerSpec.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/ranking/presentation/spec/RankingControllerSpec.kt @@ -102,4 +102,33 @@ interface RankingControllerSpec { @RequestParam(defaultValue = "10") size: Long, ): List + + @ApiErrorCodeExamples( + [ + ErrorCode.SIZE_NON_POSITIVE, + ], + ) + @Operation( + description = "종합 랭킹 조회 API", + responses = [ + ApiResponse( + responseCode = "200", + description = "종합 랭킹 조회 성공", + content = [ + Content( + mediaType = MediaType.APPLICATION_JSON_VALUE, + schema = + Schema( + implementation = UserRanking::class, + ), + ), + ], + ), + ], + ) + fun getTotalRanking( + @Positive(message = "size는 양수여야 합니다") + @RequestParam(defaultValue = "10") + size: Long, + ): List } diff --git a/src/main/kotlin/kr/weit/roadyfoody/ranking/utils/RankingConstans.kt b/src/main/kotlin/kr/weit/roadyfoody/ranking/utils/RankingConstans.kt index 9a987db2..7f75ad4a 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/ranking/utils/RankingConstans.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/ranking/utils/RankingConstans.kt @@ -3,6 +3,8 @@ package kr.weit.roadyfoody.ranking.utils const val REPORT_RANKING_KEY = "rofo:user-report-ranking" const val REVIEW_RANKING_KEY = "rofo:user-review-ranking" const val LIKE_RANKING_KEY = "rofo:user-like-ranking" +const val TOTAL_RANKING_KEY = "rofo:user-total-ranking" const val REPORT_RANKING_UPDATE_LOCK = "updateReportRankingLock" const val REVIEW_RANKING_UPDATE_LOCK = "updateReviewRankingLock" const val LIKE_RANKING_UPDATE_LOCK = "updateLikeRankingLock" +const val TOTAL_RANKING_UPDATE_LOCK = "totalLikeRankingLock" diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index d5c7e501..52755cf8 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -7,6 +7,7 @@ import com.linecorp.kotlinjdsl.support.spring.data.jpa.repository.KotlinJdslJpql import kr.weit.roadyfoody.badge.domain.Badge import kr.weit.roadyfoody.foodSpots.application.dto.ReviewAggregatedInfoResponse import kr.weit.roadyfoody.foodSpots.domain.FoodSpots +import kr.weit.roadyfoody.foodSpots.domain.FoodSpotsHistory import kr.weit.roadyfoody.global.utils.findList import kr.weit.roadyfoody.global.utils.getSlice import kr.weit.roadyfoody.ranking.dto.UserRanking @@ -51,6 +52,8 @@ interface CustomFoodSpotsReviewRepository { fun findAllUserReviewCount(): List fun findAllUserLikeCount(): List + + fun findAllUserTotalCount(): List } class CustomFoodSpotsReviewRepositoryImpl( @@ -160,6 +163,62 @@ class CustomFoodSpotsReviewRepositoryImpl( ) } + override fun findAllUserTotalCount(): List = + kotlinJdslJpqlExecutor + .findList { + val foodSpotsReview = entity(FoodSpotsReview::class, "foodSpotsReview") + val foodSpotsHistory = entity(FoodSpotsHistory::class, "foodSpotsHistory") + val reviewLike = entity(ReviewLike::class, "reviewLike") + + val subquery = + select( + coalesce( + count( + foodSpotsReview(FoodSpotsReview::id), + ).plus(sum(foodSpotsReview(FoodSpotsReview::likeTotal))), + 0, + ), + ).from( + foodSpotsReview, + ).where(foodSpotsReview(FoodSpotsReview::user)(User::id).eq(entity(User::class)(User::id))) + .asSubquery() + + val subquery2 = + select( + coalesce(count(foodSpotsHistory(FoodSpotsHistory::id)), 0), + ).from( + foodSpotsHistory, + ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) + .asSubquery() + + val latestDate = + expression( + LocalDateTime::class, + "GREATEST(COALESCE(MAX(foodSpotsReview2.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), COALESCE(MAX(foodSpotsHistory1.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), COALESCE(MAX(reviewLike2.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", + ) + + val total = expression(Long::class, "total") + selectNew( + path(User::profile)(Profile::nickname), + subquery2.plus(subquery).`as`(total), + ).from( + entity(User::class), + leftJoin(foodSpotsHistory).on(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(path(User::id))), + leftJoin( + reviewLike, + ).on(reviewLike(ReviewLike::review)(FoodSpotsReview::id).eq(foodSpotsHistory(FoodSpotsHistory::id))), + leftJoin( + foodSpotsReview, + ).on(foodSpotsReview(FoodSpotsReview::user)(User::id).eq(path(User::id))), + ).groupBy( + path(User::id), + path(User::profile)(Profile::nickname), + ).orderBy( + total.desc(), + latestDate.asc(), + ) + } + private fun Jpql.dynamicOrder(sortType: ReviewSortType): Array = when (sortType) { ReviewSortType.LATEST -> arrayOf(path(FoodSpotsReview::id).desc()) diff --git a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt index ab90d8c6..9994ac23 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt @@ -115,5 +115,33 @@ class RankingCommandServiceTest : } } } + + given("updateTotalRanking 테스트") { + every { redissonClient.getLock(any()) } returns lock + afterEach { clearMocks(reviewRepository) } + + `when`("Lock을 획득한 경우") { + every { lock.tryLock(0, 10, TimeUnit.MINUTES) } returns true + + every { redisTemplate.delete("rofo:user-total-ranking") } returns true + every { reviewRepository.findAllUserTotalCount() } returns createUserRankingResponse() + every { redisTemplate.opsForList() } returns list + every { list.rightPushAll(any(), any>()) } returns 1L + + then("레디스의 데이터가 정상적으로 업데이트된다.") { + rankingCommandService.updateTotalRanking() + verify(exactly = 1) { reviewRepository.findAllUserTotalCount() } + } + } + + `when`("Lock을 획득하지 못한 경우") { + every { lock.tryLock(0, 10, TimeUnit.MINUTES) } returns false + + then("레디스의 데이터가 업데이트되지 않는다.") { + rankingCommandService.updateTotalRanking() + verify(exactly = 0) { reviewRepository.findAllUserTotalCount() } + } + } + } }, ) diff --git a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt index f1201949..60a38125 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt @@ -108,5 +108,38 @@ class RankingQueryServiceTest : } } } + given("getTotalRanking 테스트") { + `when`("레디스의 데이터를 조회한 경우") { + every { redisTemplate.opsForList() } returns listOperation + every { listOperation.range(any(), any(), any()) } returns list + + then("종합 랭킹이 조회된다.") { + rankingQueryService.getTotalRanking(10) + verify(exactly = 1) { listOperation.range(any(), any(), any()) } + } + } + + `when`("레디스의 데이터가 null인 경우") { + every { redisTemplate.opsForList() } returns listOperation + every { listOperation.range(any(), any(), any()) } returns null + every { listOperation.rightPushAll(any(), any>()) } returns 1L + every { reviewRepository.findAllUserTotalCount() } returns createUserRankingResponse() + + then("예외가 발생한다.") { + shouldThrow { rankingQueryService.getTotalRanking(10) } + } + } + + `when`("레디스의 데이터가 빈값인 경우") { + every { redisTemplate.opsForList() } returns listOperation + every { listOperation.range(any(), any(), any()) } returns listOf() + every { listOperation.rightPushAll(any(), any>()) } returns 1L + every { reviewRepository.findAllUserTotalCount() } returns createUserRankingResponse() + + then("예외가 발생한다.") { + shouldThrow { rankingQueryService.getTotalRanking(10) } + } + } + } }, ) diff --git a/src/test/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingControllerTest.kt b/src/test/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingControllerTest.kt index 9d0c3712..86807741 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingControllerTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/ranking/presentation/api/RankingControllerTest.kt @@ -98,5 +98,31 @@ class RankingControllerTest( } } } + + given("GET $requestPath/total") { + val response = createUserRankingResponse() + every { + rankingQueryService.getTotalRanking(any()) + } returns response + `when`("정상적인 데이터가 들어올 경우") { + then("좋아요 랭킹 리스트가 조회된다.") { + mockMvc + .perform( + getWithAuth("$requestPath/total") + .param("size", "$TEST_PAGE_SIZE"), + ).andExpect(status().isOk) + } + } + + `when`("size가 음수가 들어올 경우") { + then("400을 반환한다") { + mockMvc + .perform( + getWithAuth("$requestPath/total") + .param("size", "-1"), + ).andExpect(status().isBadRequest) + } + } + } }, ) diff --git a/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt b/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt index a04c8b00..b51205d4 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt @@ -239,5 +239,21 @@ class FoodSpotsReviewRepositoryTest( userLikeCounts[2].total shouldBe 2 } } + + describe("findAllUserTotalCount 메소드는") { + it("전체 회원의 종합 랭킹을 리스트로 반환한다") { + val userTotalCounts = reviewRepository.findAllUserTotalCount() + userTotalCounts.size shouldBe 3 + + userTotalCounts[0].userNickname shouldBe "existentNick" + userTotalCounts[0].total shouldBe 6 + + userTotalCounts[1].userNickname shouldBe "otherUser" + userTotalCounts[1].total shouldBe 4 + + userTotalCounts[2].userNickname shouldBe "testUser" + userTotalCounts[2].total shouldBe 4 + } + } }, ) From eea520d995d7a2be71adcd89596b34c406e641a6 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Tue, 10 Sep 2024 22:10:58 +0900 Subject: [PATCH 02/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=A2=85=ED=95=A9?= =?UTF-8?q?=EB=9E=AD=ED=82=B9=20-=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/repository/FoodSpotsReviewRepository.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 52755cf8..30eeca75 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -194,7 +194,10 @@ class CustomFoodSpotsReviewRepositoryImpl( val latestDate = expression( LocalDateTime::class, - "GREATEST(COALESCE(MAX(foodSpotsReview2.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), COALESCE(MAX(foodSpotsHistory1.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), COALESCE(MAX(reviewLike2.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", + "GREATEST(" + + "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + + "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + + "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", ) val total = expression(Long::class, "total") From c65a897944aab0e2c8a9f92533e0680f6b18212c Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Tue, 10 Sep 2024 23:07:50 +0900 Subject: [PATCH 03/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/repository/FoodSpotsReviewRepository.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 76009ae8..cc3954fe 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -231,12 +231,12 @@ class CustomFoodSpotsReviewRepositoryImpl( ).from( entity(User::class), leftJoin(foodSpotsHistory).on(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(path(User::id))), - leftJoin( - reviewLike, - ).on(reviewLike(ReviewLike::review)(FoodSpotsReview::id).eq(foodSpotsHistory(FoodSpotsHistory::id))), leftJoin( foodSpotsReview, ).on(foodSpotsReview(FoodSpotsReview::user)(User::id).eq(path(User::id))), + leftJoin( + reviewLike, + ).on(reviewLike(ReviewLike::review)(FoodSpotsReview::id).eq(foodSpotsReview(FoodSpotsReview::id))), ).groupBy( path(User::id), path(User::profile)(Profile::nickname), From 047abbefeed6c61b4a7290c371f4f3ff1f9a5707 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Tue, 10 Sep 2024 23:39:04 +0900 Subject: [PATCH 04/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/repository/FoodSpotsReviewRepository.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index cc3954fe..b886b794 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -1,5 +1,6 @@ package kr.weit.roadyfoody.review.repository +import com.google.protobuf.Timestamp import com.linecorp.kotlinjdsl.dsl.jpql.Jpql import com.linecorp.kotlinjdsl.querymodel.jpql.predicate.Predicate import com.linecorp.kotlinjdsl.querymodel.jpql.sort.Sortable @@ -216,12 +217,12 @@ class CustomFoodSpotsReviewRepositoryImpl( .asSubquery() val latestDate = - expression( - LocalDateTime::class, + customExpression( + Timestamp::class, "GREATEST(" + - "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + - "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + - "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", + "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00'))," + + "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00'))," + + "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')))", ) val total = expression(Long::class, "total") From e76ec618fbc18c04f28663883f0d9abee90b40f5 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 06:41:02 +0900 Subject: [PATCH 05/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=9B=90=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/repository/FoodSpotsReviewRepository.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index b886b794..70f7e91b 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -1,6 +1,5 @@ package kr.weit.roadyfoody.review.repository -import com.google.protobuf.Timestamp import com.linecorp.kotlinjdsl.dsl.jpql.Jpql import com.linecorp.kotlinjdsl.querymodel.jpql.predicate.Predicate import com.linecorp.kotlinjdsl.querymodel.jpql.sort.Sortable @@ -218,11 +217,11 @@ class CustomFoodSpotsReviewRepositoryImpl( val latestDate = customExpression( - Timestamp::class, + LocalDateTime::class, "GREATEST(" + - "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00'))," + - "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00'))," + - "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')))", + "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + + "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + + "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", ) val total = expression(Long::class, "total") From 7a887925f336410ece6e470d872dff6a2d66273f Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 06:45:45 +0900 Subject: [PATCH 06/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 18 +++++++++--------- .../FoodSpotsReviewRepositoryTest.kt | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 70f7e91b..f0eb81cd 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -215,14 +215,14 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() - val latestDate = - customExpression( - LocalDateTime::class, - "GREATEST(" + - "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + - "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + - "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", - ) +// val latestDate = +// customExpression( +// LocalDateTime::class, +// "GREATEST(" + +// "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + +// "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + +// "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", +// ) val total = expression(Long::class, "total") selectNew( @@ -242,7 +242,7 @@ class CustomFoodSpotsReviewRepositoryImpl( path(User::profile)(Profile::nickname), ).orderBy( total.desc(), - latestDate.asc(), + // latestDate.asc(), ) } diff --git a/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt b/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt index 13c968c8..77f9ec1d 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt @@ -262,10 +262,10 @@ class FoodSpotsReviewRepositoryTest( userTotalCounts[0].userNickname shouldBe "existentNick" userTotalCounts[0].total shouldBe 6 - userTotalCounts[1].userNickname shouldBe "otherUser" + userTotalCounts[1].userNickname shouldBe "testUser" userTotalCounts[1].total shouldBe 4 - userTotalCounts[2].userNickname shouldBe "testUser" + userTotalCounts[2].userNickname shouldBe "otherUser" userTotalCounts[2].total shouldBe 4 } } From cd4c479b620496a2a5c5535e0431affcf13f609e Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 06:52:21 +0900 Subject: [PATCH 07/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 18 +++++++++--------- .../FoodSpotsReviewRepositoryTest.kt | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index f0eb81cd..f5a3dd1b 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -215,14 +215,14 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() -// val latestDate = -// customExpression( -// LocalDateTime::class, -// "GREATEST(" + -// "COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + -// "COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59'))," + -// "COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))", -// ) + val latestDate = + customExpression( + LocalDateTime::class, + """GREATEST( + COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), + COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), + COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))""", + ) val total = expression(Long::class, "total") selectNew( @@ -242,7 +242,7 @@ class CustomFoodSpotsReviewRepositoryImpl( path(User::profile)(Profile::nickname), ).orderBy( total.desc(), - // latestDate.asc(), + latestDate.asc(), ) } diff --git a/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt b/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt index 77f9ec1d..13c968c8 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepositoryTest.kt @@ -262,10 +262,10 @@ class FoodSpotsReviewRepositoryTest( userTotalCounts[0].userNickname shouldBe "existentNick" userTotalCounts[0].total shouldBe 6 - userTotalCounts[1].userNickname shouldBe "testUser" + userTotalCounts[1].userNickname shouldBe "otherUser" userTotalCounts[1].total shouldBe 4 - userTotalCounts[2].userNickname shouldBe "otherUser" + userTotalCounts[2].userNickname shouldBe "testUser" userTotalCounts[2].total shouldBe 4 } } From a7edde6b1d2bebc9d398667a877828a344f684ea Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 06:58:52 +0900 Subject: [PATCH 08/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index f5a3dd1b..d869171b 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -215,14 +215,14 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() - val latestDate = - customExpression( - LocalDateTime::class, - """GREATEST( - COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), - COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), - COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))""", - ) +// val latestDate = +// customExpression( +// LocalDateTime::class, +// """GREATEST( +// COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), +// COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), +// COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))""", +// ) val total = expression(Long::class, "total") selectNew( @@ -242,7 +242,7 @@ class CustomFoodSpotsReviewRepositoryImpl( path(User::profile)(Profile::nickname), ).orderBy( total.desc(), - latestDate.asc(), + // latestDate.asc(), ) } From cba2ff6a582da17fd4ade91c4a24fbed86dc5237 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 07:11:38 +0900 Subject: [PATCH 09/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/repository/FoodSpotsReviewRepository.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index d869171b..ea5b4189 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -224,6 +224,12 @@ class CustomFoodSpotsReviewRepositoryImpl( // COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))""", // ) + val latestDate = + customExpression( + LocalDateTime::class, + """MAX(foodSpotsReview.createdDateTime)""", + ) + val total = expression(Long::class, "total") selectNew( path(User::profile)(Profile::nickname), @@ -242,7 +248,7 @@ class CustomFoodSpotsReviewRepositoryImpl( path(User::profile)(Profile::nickname), ).orderBy( total.desc(), - // latestDate.asc(), + latestDate.asc(), ) } From 3932579409469afb8f624ab88624d685c1cd08b4 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 07:23:43 +0900 Subject: [PATCH 10/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roadyfoody/review/repository/FoodSpotsReviewRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index ea5b4189..39be59f7 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -227,7 +227,7 @@ class CustomFoodSpotsReviewRepositoryImpl( val latestDate = customExpression( LocalDateTime::class, - """MAX(foodSpotsReview.createdDateTime)""", + """MAX(foodSpotsReview.createdDateTime),MAX(foodSpotsHistory.createdDateTime),MAX(reviewLike.createdDateTime)""", ) val total = expression(Long::class, "total") From f81c0b7f82b9de391de81f860198c770022038a1 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 07:30:24 +0900 Subject: [PATCH 11/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roadyfoody/review/repository/FoodSpotsReviewRepository.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 39be59f7..66ea87d6 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -227,7 +227,9 @@ class CustomFoodSpotsReviewRepositoryImpl( val latestDate = customExpression( LocalDateTime::class, - """MAX(foodSpotsReview.createdDateTime),MAX(foodSpotsHistory.createdDateTime),MAX(reviewLike.createdDateTime)""", + """GREATEST( + MAX(foodSpotsReview.createdDateTime),MAX(foodSpotsHistory.createdDateTime),MAX(reviewLike.createdDateTime) + )""", ) val total = expression(Long::class, "total") From 48a5de7387c05ccec0d2cb3c2606444cd5b164c3 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 07:39:59 +0900 Subject: [PATCH 12/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt b/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt index 1144dae1..35af5314 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt @@ -1,3 +1,5 @@ +@file:Suppress("ktlint:standard:filename") + package kr.weit.roadyfoody.common.domain.query import com.linecorp.kotlinjdsl.dsl.jpql.Jpql From 0b7efddc42d075686779149e11fe8137f6f91a4d Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 07:47:27 +0900 Subject: [PATCH 13/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9=20-=20=EC=9B=90=EB=B3=B5,=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/query/QueryDomainDsl.kt | 2 -- .../repository/FoodSpotsReviewRepository.kt | 24 ++++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt b/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt index 35af5314..1144dae1 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/common/domain/query/QueryDomainDsl.kt @@ -1,5 +1,3 @@ -@file:Suppress("ktlint:standard:filename") - package kr.weit.roadyfoody.common.domain.query import com.linecorp.kotlinjdsl.dsl.jpql.Jpql diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 66ea87d6..208f3dbf 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -21,6 +21,7 @@ import kr.weit.roadyfoody.user.domain.User import org.springframework.data.domain.Pageable import org.springframework.data.domain.Slice import org.springframework.data.jpa.repository.JpaRepository +import java.time.LocalDate import java.time.LocalDateTime fun FoodSpotsReviewRepository.getReviewByReviewId(reviewId: Long): FoodSpotsReview = @@ -215,23 +216,24 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() + val latestDate = + customExpression( + LocalDate::class, + """GREATEST( + COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), + COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), + COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))""", + ) + // val latestDate = // customExpression( // LocalDateTime::class, // """GREATEST( -// COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), -// COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')), -// COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 23:59:59')))""", +// COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), +// COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), +// COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))""", // ) - val latestDate = - customExpression( - LocalDateTime::class, - """GREATEST( - MAX(foodSpotsReview.createdDateTime),MAX(foodSpotsHistory.createdDateTime),MAX(reviewLike.createdDateTime) - )""", - ) - val total = expression(Long::class, "total") selectNew( path(User::profile)(Profile::nickname), From 7cbc8e3407fec546fae63b3c5e226b8dc79eaa6e Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 07:50:47 +0900 Subject: [PATCH 14/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/repository/FoodSpotsReviewRepository.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 208f3dbf..dfd49ef4 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -21,7 +21,6 @@ import kr.weit.roadyfoody.user.domain.User import org.springframework.data.domain.Pageable import org.springframework.data.domain.Slice import org.springframework.data.jpa.repository.JpaRepository -import java.time.LocalDate import java.time.LocalDateTime fun FoodSpotsReviewRepository.getReviewByReviewId(reviewId: Long): FoodSpotsReview = @@ -218,11 +217,11 @@ class CustomFoodSpotsReviewRepositoryImpl( val latestDate = customExpression( - LocalDate::class, + LocalDateTime::class, """GREATEST( - COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), - COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), - COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))""", + COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), + COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), + COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))""", ) // val latestDate = From fc5366fa9b3d459589e49e7eb148114324ba5115 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 08:04:29 +0900 Subject: [PATCH 15/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index dfd49ef4..22cef3d9 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -215,24 +215,24 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() - val latestDate = - customExpression( - LocalDateTime::class, - """GREATEST( - COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), - COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), - COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))""", - ) - // val latestDate = // customExpression( -// LocalDateTime::class, +// LocalDate::class, // """GREATEST( -// COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), -// COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), -// COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))""", +// COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31 00:00:00')), +// COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31 00:00:00')), +// COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31 00:00:00'))""", // ) + val latestDate = + customExpression( + LocalDateTime::class, + """GREATEST( + CAST(COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')) AS TIMESTAMP), + CAST(COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')) AS TIMESTAMP), + CAST(COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')) AS TIMESTAMP) + )""", + ) val total = expression(Long::class, "total") selectNew( path(User::profile)(Profile::nickname), From 5dc806f269e0628e31a0365f44b934bec9ff6b4f Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Wed, 11 Sep 2024 08:41:43 +0900 Subject: [PATCH 16/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 22cef3d9..8d6dd269 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -224,13 +224,22 @@ class CustomFoodSpotsReviewRepositoryImpl( // COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31 00:00:00'))""", // ) +// val latestDate = +// customExpression( +// LocalDateTime::class, +// """GREATEST( +// MAX(foodSpotsReview.createdDateTime), +// MAX(foodSpotsHistory.createdDateTime), +// MAX(reviewLike.createdDateTime)) +// )""", +// ) val latestDate = customExpression( LocalDateTime::class, """GREATEST( - CAST(COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')) AS TIMESTAMP), - CAST(COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')) AS TIMESTAMP), - CAST(COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00')) AS TIMESTAMP) + COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00.083988')), + COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00.083988')), + COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00.083988')) )""", ) val total = expression(Long::class, "total") From 8728761e8faf1a1cb479d614b6a20168764e94bd Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Thu, 12 Sep 2024 13:30:02 +0900 Subject: [PATCH 17/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 8d6dd269..8c1ed9ce 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -215,31 +215,13 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() -// val latestDate = -// customExpression( -// LocalDate::class, -// """GREATEST( -// COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31 00:00:00')), -// COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31 00:00:00')), -// COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31 00:00:00'))""", -// ) - -// val latestDate = -// customExpression( -// LocalDateTime::class, -// """GREATEST( -// MAX(foodSpotsReview.createdDateTime), -// MAX(foodSpotsHistory.createdDateTime), -// MAX(reviewLike.createdDateTime)) -// )""", -// ) val latestDate = customExpression( LocalDateTime::class, """GREATEST( - COALESCE(MAX(foodSpotsReview.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00.083988')), - COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00.083988')), - COALESCE(MAX(reviewLike.createdDateTime),TO_TIMESTAMP('1970-12-31 00:00:00.083988')) + COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31')), + COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31')), + COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31')) )""", ) val total = expression(Long::class, "total") From 2046c64ed5ac5f44d3194be686a4b9976fc7157b Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Thu, 12 Sep 2024 17:09:20 +0900 Subject: [PATCH 18/21] =?UTF-8?q?[feature/ROFO-184]=20github=20action=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roadyfoody/review/repository/FoodSpotsReviewRepository.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index 8c1ed9ce..ed98b2d3 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -22,6 +22,7 @@ import org.springframework.data.domain.Pageable import org.springframework.data.domain.Slice import org.springframework.data.jpa.repository.JpaRepository import java.time.LocalDateTime +import java.util.Date fun FoodSpotsReviewRepository.getReviewByReviewId(reviewId: Long): FoodSpotsReview = findById(reviewId).orElseThrow { @@ -217,7 +218,7 @@ class CustomFoodSpotsReviewRepositoryImpl( val latestDate = customExpression( - LocalDateTime::class, + Date::class, """GREATEST( COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31')), COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31')), From c2f0492a4c952f298eb368a04e4126ad98cf1d07 Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Fri, 13 Sep 2024 00:29:54 +0900 Subject: [PATCH 19/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FoodSpotsReviewRepository.kt | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt index ed98b2d3..c496d409 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/review/repository/FoodSpotsReviewRepository.kt @@ -1,6 +1,7 @@ package kr.weit.roadyfoody.review.repository import com.linecorp.kotlinjdsl.dsl.jpql.Jpql +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions import com.linecorp.kotlinjdsl.querymodel.jpql.predicate.Predicate import com.linecorp.kotlinjdsl.querymodel.jpql.sort.Sortable import com.linecorp.kotlinjdsl.support.spring.data.jpa.repository.KotlinJdslJpqlExecutor @@ -22,7 +23,6 @@ import org.springframework.data.domain.Pageable import org.springframework.data.domain.Slice import org.springframework.data.jpa.repository.JpaRepository import java.time.LocalDateTime -import java.util.Date fun FoodSpotsReviewRepository.getReviewByReviewId(reviewId: Long): FoodSpotsReview = findById(reviewId).orElseThrow { @@ -216,14 +216,21 @@ class CustomFoodSpotsReviewRepositoryImpl( ).where(foodSpotsHistory(FoodSpotsHistory::user)(User::id).eq(entity(User::class)(User::id))) .asSubquery() - val latestDate = - customExpression( - Date::class, - """GREATEST( - COALESCE(MAX(foodSpotsReview.createdDateTime),TO_DATE('1970-12-31')), - COALESCE(MAX(foodSpotsHistory.createdDateTime),TO_DATE('1970-12-31')), - COALESCE(MAX(reviewLike.createdDateTime),TO_DATE('1970-12-31')) - )""", + val defaultDate = LocalDateTime.parse("1970-12-31T00:00:00") + + val maxReviewDate = coalesce(max(foodSpotsReview(FoodSpotsReview::createdDateTime)), defaultDate) + val maxHistoryDate = coalesce(max(foodSpotsHistory(FoodSpotsHistory::createdDateTime)), defaultDate) + val maxLikeDate = coalesce(max(reviewLike(ReviewLike::createdDateTime)), defaultDate) + + val greatestDateExpression = + Expressions.customExpression( + LocalDateTime::class, + "GREATEST({0}, {1}, {2})", + listOf( + maxReviewDate, + maxHistoryDate, + maxLikeDate, + ), ) val total = expression(Long::class, "total") selectNew( @@ -243,7 +250,7 @@ class CustomFoodSpotsReviewRepositoryImpl( path(User::profile)(Profile::nickname), ).orderBy( total.desc(), - latestDate.asc(), + greatestDateExpression.asc(), ) } From e750c1818c71eefd0e364b8f17541c665a2ff8fd Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Sat, 14 Sep 2024 18:11:41 +0900 Subject: [PATCH 20/21] =?UTF-8?q?[feature/ROFO-184]=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/RankingCommandServiceTest.kt | 12 ++++-- .../service/RankingQueryServiceTest.kt | 37 +++++++++++++++++-- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt index 9994ac23..fcebaddf 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingCommandServiceTest.kt @@ -7,6 +7,10 @@ import io.mockk.mockk import io.mockk.verify import kr.weit.roadyfoody.foodSpots.repository.FoodSpotsHistoryRepository import kr.weit.roadyfoody.ranking.fixture.createUserRankingResponse +import kr.weit.roadyfoody.ranking.utils.LIKE_RANKING_KEY +import kr.weit.roadyfoody.ranking.utils.REPORT_RANKING_KEY +import kr.weit.roadyfoody.ranking.utils.REVIEW_RANKING_KEY +import kr.weit.roadyfoody.ranking.utils.TOTAL_RANKING_KEY import kr.weit.roadyfoody.review.repository.FoodSpotsReviewRepository import org.redisson.api.RLock import org.redisson.api.RedissonClient @@ -39,7 +43,7 @@ class RankingCommandServiceTest : `when`("Lock을 획득한 경우") { every { lock.tryLock(0, 10, TimeUnit.MINUTES) } returns true - every { redisTemplate.delete("rofo:user-report-ranking") } returns true + every { redisTemplate.delete(REPORT_RANKING_KEY) } returns true every { foodSpotsHistoryRepository.findAllUserReportCount() } returns createUserRankingResponse() every { redisTemplate.opsForList() } returns list every { list.rightPushAll(any(), any>()) } returns 1L @@ -67,7 +71,7 @@ class RankingCommandServiceTest : `when`("Lock을 획득한 경우") { every { lock.tryLock(0, 10, TimeUnit.MINUTES) } returns true - every { redisTemplate.delete("rofo:user-review-ranking") } returns true + every { redisTemplate.delete(REVIEW_RANKING_KEY) } returns true every { reviewRepository.findAllUserReviewCount() } returns createUserRankingResponse() every { redisTemplate.opsForList() } returns list every { list.rightPushAll(any(), any>()) } returns 1L @@ -95,7 +99,7 @@ class RankingCommandServiceTest : `when`("Lock을 획득한 경우") { every { lock.tryLock(0, 10, TimeUnit.MINUTES) } returns true - every { redisTemplate.delete("rofo:user-like-ranking") } returns true + every { redisTemplate.delete(LIKE_RANKING_KEY) } returns true every { reviewRepository.findAllUserLikeCount() } returns createUserRankingResponse() every { redisTemplate.opsForList() } returns list every { list.rightPushAll(any(), any>()) } returns 1L @@ -123,7 +127,7 @@ class RankingCommandServiceTest : `when`("Lock을 획득한 경우") { every { lock.tryLock(0, 10, TimeUnit.MINUTES) } returns true - every { redisTemplate.delete("rofo:user-total-ranking") } returns true + every { redisTemplate.delete(TOTAL_RANKING_KEY) } returns true every { reviewRepository.findAllUserTotalCount() } returns createUserRankingResponse() every { redisTemplate.opsForList() } returns list every { list.rightPushAll(any(), any>()) } returns 1L diff --git a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt index 60a38125..a59ba2fb 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt @@ -2,8 +2,10 @@ package kr.weit.roadyfoody.ranking.application.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.Runs import io.mockk.clearMocks import io.mockk.every +import io.mockk.just import io.mockk.mockk import io.mockk.verify import kr.weit.roadyfoody.foodSpots.repository.FoodSpotsHistoryRepository @@ -16,7 +18,6 @@ import org.springframework.data.redis.core.RedisTemplate class RankingQueryServiceTest : BehaviorSpec( { - val redisTemplate = mockk>() val foodSpotsHistoryRepository = mockk() val reviewRepository = mockk() @@ -29,6 +30,7 @@ class RankingQueryServiceTest : afterEach { clearMocks(reviewRepository) } afterEach { clearMocks(listOperation) } + afterEach { clearMocks(rankingCommandService) } given("getReportRanking 테스트") { `when`("레디스의 데이터를 조회한 경우") { @@ -109,6 +111,7 @@ class RankingQueryServiceTest : } } given("getTotalRanking 테스트") { + `when`("레디스의 데이터를 조회한 경우") { every { redisTemplate.opsForList() } returns listOperation every { listOperation.range(any(), any(), any()) } returns list @@ -124,9 +127,24 @@ class RankingQueryServiceTest : every { listOperation.range(any(), any(), any()) } returns null every { listOperation.rightPushAll(any(), any>()) } returns 1L every { reviewRepository.findAllUserTotalCount() } returns createUserRankingResponse() - + every { + rankingCommandService.updateRanking( + any(), + any(), + any(), + ) + } just Runs then("예외가 발생한다.") { + shouldThrow { rankingQueryService.getTotalRanking(10) } + + verify(exactly = 1) { + rankingCommandService.updateRanking( + any(), + any(), + any(), + ) + } } } @@ -135,9 +153,22 @@ class RankingQueryServiceTest : every { listOperation.range(any(), any(), any()) } returns listOf() every { listOperation.rightPushAll(any(), any>()) } returns 1L every { reviewRepository.findAllUserTotalCount() } returns createUserRankingResponse() - + every { + rankingCommandService.updateRanking( + any(), + any(), + any(), + ) + } just Runs then("예외가 발생한다.") { shouldThrow { rankingQueryService.getTotalRanking(10) } + verify(exactly = 1) { + rankingCommandService.updateRanking( + any(), + any(), + any(), + ) + } } } } From 2934cd7828ca90113b752b895624fda5712f4c0f Mon Sep 17 00:00:00 2001 From: hyunjungkimm Date: Sat, 14 Sep 2024 18:47:34 +0900 Subject: [PATCH 21/21] =?UTF-8?q?[feature/ROFO-184]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ranking/application/service/RankingQueryService.kt | 6 ++++-- .../ranking/application/service/RankingQueryServiceTest.kt | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt b/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt index 4df27afd..787b8c9f 100644 --- a/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt +++ b/src/main/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryService.kt @@ -15,6 +15,7 @@ import kr.weit.roadyfoody.review.repository.FoodSpotsReviewRepository import org.springframework.data.redis.core.RedisTemplate import org.springframework.stereotype.Service import java.util.concurrent.CompletableFuture +import java.util.concurrent.ExecutorService @Service class RankingQueryService( @@ -22,6 +23,7 @@ class RankingQueryService( private val foodSpotsHistoryRepository: FoodSpotsHistoryRepository, private val reviewRepository: FoodSpotsReviewRepository, private val rankingCommandService: RankingCommandService, + private val executor: ExecutorService, ) { fun getReportRanking(size: Long): List = getRanking( @@ -67,13 +69,13 @@ class RankingQueryService( .range(key, 0, size - 1) if (ranking.isNullOrEmpty()) { - CompletableFuture.runAsync { + CompletableFuture.runAsync({ rankingCommandService.updateRanking( lockName = lockName, key = key, dataProvider = dataProvider, ) - } + }, executor) throw RankingNotFoundException() } return ranking.map { score -> diff --git a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt index a59ba2fb..4d6a5cdc 100644 --- a/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt +++ b/src/test/kotlin/kr/weit/roadyfoody/ranking/application/service/RankingQueryServiceTest.kt @@ -14,6 +14,7 @@ import kr.weit.roadyfoody.ranking.fixture.createUserRankingResponse import kr.weit.roadyfoody.review.repository.FoodSpotsReviewRepository import org.springframework.data.redis.core.ListOperations import org.springframework.data.redis.core.RedisTemplate +import java.util.concurrent.ExecutorService class RankingQueryServiceTest : BehaviorSpec( @@ -22,8 +23,9 @@ class RankingQueryServiceTest : val foodSpotsHistoryRepository = mockk() val reviewRepository = mockk() val rankingCommandService = mockk() + val executor = mockk() val rankingQueryService = - RankingQueryService(redisTemplate, foodSpotsHistoryRepository, reviewRepository, rankingCommandService) + RankingQueryService(redisTemplate, foodSpotsHistoryRepository, reviewRepository, rankingCommandService, executor) val listOperation = mockk>() val list = listOf("user1:10", "user2:20", "user3:15") @@ -31,6 +33,9 @@ class RankingQueryServiceTest : afterEach { clearMocks(reviewRepository) } afterEach { clearMocks(listOperation) } afterEach { clearMocks(rankingCommandService) } + every { executor.execute(any()) } answers { + firstArg().run() + } given("getReportRanking 테스트") { `when`("레디스의 데이터를 조회한 경우") {