File tree Expand file tree Collapse file tree 9 files changed +67
-3
lines changed
src/main/kotlin/org/gitanimals Expand file tree Collapse file tree 9 files changed +67
-3
lines changed Original file line number Diff line number Diff line change @@ -6,11 +6,11 @@ import org.slf4j.LoggerFactory
66import org.springframework.http.HttpStatus
77import org.springframework.http.ResponseEntity
88import org.springframework.web.bind.MissingRequestHeaderException
9+ import org.springframework.web.bind.MissingServletRequestParameterException
910import org.springframework.web.bind.annotation.ExceptionHandler
1011import org.springframework.web.bind.annotation.ResponseStatus
1112import org.springframework.web.bind.annotation.RestControllerAdvice
1213import org.springframework.web.servlet.NoHandlerFoundException
13- import java.lang.Exception
1414
1515@RestControllerAdvice
1616class GlobalExceptionHandler {
@@ -27,6 +27,11 @@ class GlobalExceptionHandler {
2727 return ResponseEntity .badRequest().body(ErrorResponse .from(exception))
2828 }
2929
30+ @ResponseStatus(HttpStatus .BAD_REQUEST )
31+ @ExceptionHandler(MissingServletRequestParameterException ::class )
32+ fun handleMissingServletRequestParameterException (exception : MissingServletRequestParameterException ) =
33+ ErrorResponse .from(exception)
34+
3035 @ResponseStatus(HttpStatus .INTERNAL_SERVER_ERROR )
3136 @ExceptionHandler(IllegalStateException ::class )
3237 fun handleIllegalStateException (exception : IllegalStateException ): ErrorResponse {
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import org.gitanimals.rank.domain.RankQueryRepository.RankType.WEEKLY_USER_CONTR
77import org.gitanimals.rank.domain.UserContributionRankService
88import org.gitanimals.rank.domain.response.RankResponse
99import org.slf4j.LoggerFactory
10+ import org.springframework.cache.annotation.Cacheable
1011import org.springframework.stereotype.Component
1112
1213@Component
@@ -38,4 +39,11 @@ class RankQueryFacade(
3839 WEEKLY_USER_CONTRIBUTIONS -> userContributionRankService.findAllByRankIds(rankWithIds)
3940 }
4041 }
42+
43+ @Cacheable(cacheNames = [" rankTotalCountCacheManager" ], key = " #rankType" )
44+ fun findRankTotalCountByRankType (
45+ rankType : RankQueryRepository .RankType ,
46+ ): Int {
47+ return rankQueryRepository.getTotalRankCount(rankType)
48+ }
4149}
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ package org.gitanimals.rank.controller
33import org.gitanimals.rank.app.GetRankByUsernameFacade
44import org.gitanimals.rank.app.RankQueryFacade
55import org.gitanimals.rank.controller.response.RankHistoryResponse
6+ import org.gitanimals.rank.controller.response.RankTotalCountResponse
67import org.gitanimals.rank.domain.RankQueryRepository
78import org.gitanimals.rank.domain.history.RankHistoryService
89import org.gitanimals.rank.domain.response.RankResponse
@@ -39,4 +40,10 @@ class RankController(
3940
4041 return RankHistoryResponse .from(rankHistories)
4142 }
43+
44+ @GetMapping(" /ranks/total" )
45+ fun getTotalRankCountsByRankType (
46+ @RequestParam(" type" ) rankType : RankQueryRepository .RankType ,
47+ ): RankTotalCountResponse =
48+ RankTotalCountResponse (rankQueryFacade.findRankTotalCountByRankType(rankType))
4249}
Original file line number Diff line number Diff line change 1+ package org.gitanimals.rank.controller.response
2+
3+ data class RankTotalCountResponse (
4+ val count : Int ,
5+ )
Original file line number Diff line number Diff line change @@ -10,6 +10,8 @@ interface RankQueryRepository {
1010
1111 fun initialRank (rankType : RankType )
1212
13+ fun getTotalRankCount (rankType : RankType ): Int
14+
1315 enum class RankType {
1416 WEEKLY_GUILD_CONTRIBUTIONS ,
1517 WEEKLY_USER_CONTRIBUTIONS ,
Original file line number Diff line number Diff line change @@ -30,7 +30,7 @@ class RankHistoryService(
3030 })
3131 }
3232
33- @Cacheable(cacheNames = [" find_top3_history_by_rank_type" ], )
33+ @Cacheable(cacheNames = [" find_top3_history_by_rank_type" ])
3434 fun findTop3HistoryByRankType (rankType : RankType ): List <RankHistory > {
3535 return rankHistoryRepository.findTop3ByRankTypeOrderByCreatedAtDesc(rankType)
3636 .sortedBy { it.ranks }
Original file line number Diff line number Diff line change 1+ package org.gitanimals.rank.infra
2+
3+ import com.github.benmanes.caffeine.cache.Caffeine
4+ import org.springframework.cache.CacheManager
5+ import org.springframework.cache.caffeine.CaffeineCacheManager
6+ import org.springframework.context.annotation.Bean
7+ import org.springframework.context.annotation.Configuration
8+ import kotlin.time.Duration.Companion.minutes
9+ import kotlin.time.toJavaDuration
10+
11+ @Configuration
12+ class RankCacheConfigurer {
13+
14+ @Bean
15+ fun rankTotalCountCacheManager (): CacheManager {
16+ val caffeineConfig = Caffeine .newBuilder().expireAfterWrite(10 .minutes.toJavaDuration())
17+
18+ val caffeineCacheManager = CaffeineCacheManager ()
19+ caffeineCacheManager.setCaffeine(caffeineConfig)
20+
21+ return caffeineCacheManager
22+ }
23+ }
Original file line number Diff line number Diff line change @@ -40,7 +40,10 @@ class RedisRankQueryRepository(
4040 .toSet()
4141 }
4242
43- override fun getRankByRankId (rankType : RankQueryRepository .RankType , rankId : Long ): RankQueryResponse {
43+ override fun getRankByRankId (
44+ rankType : RankQueryRepository .RankType ,
45+ rankId : Long ,
46+ ): RankQueryResponse {
4447 val rank = redisTemplate.opsForZSet()
4548 .reverseRank(rankType.name, rankId.toString())
4649
@@ -52,6 +55,11 @@ class RedisRankQueryRepository(
5255 )
5356 }
5457
58+ override fun getTotalRankCount (rankType : RankQueryRepository .RankType ): Int {
59+ return redisTemplate.opsForZSet()
60+ .zCard(rankType.name)?.toInt() ? : RETURN_ZERO_WHEN_USED_IN_PIPELINE_BIA_TRANSACTION
61+ }
62+
5563 @TransactionalEventListener(
5664 value = [RankUpdated ::class ],
5765 phase = TransactionPhase .AFTER_COMMIT ,
@@ -72,4 +80,8 @@ class RedisRankQueryRepository(
7280 redisTemplate.opsForZSet()
7381 .add(rankType.name, rankId.value.toString(), score.toDouble())
7482 }
83+
84+ companion object {
85+ private const val RETURN_ZERO_WHEN_USED_IN_PIPELINE_BIA_TRANSACTION = 0
86+ }
7587}
Original file line number Diff line number Diff line change @@ -5,13 +5,15 @@ import org.springframework.cache.CacheManager
55import org.springframework.cache.caffeine.CaffeineCacheManager
66import org.springframework.context.annotation.Bean
77import org.springframework.context.annotation.Configuration
8+ import org.springframework.context.annotation.Primary
89import kotlin.time.Duration.Companion.hours
910import kotlin.time.toJavaDuration
1011
1112@Configuration
1213class CacheConfigurer {
1314
1415 @Bean
16+ @Primary
1517 fun cacheManager (caffeine : Caffeine <Any , Any >): CacheManager {
1618 val caffeineCacheManager = CaffeineCacheManager ()
1719 caffeineCacheManager.setCaffeine(caffeine)
You canโt perform that action at this time.
0 commit comments