Skip to content

Commit 18b7a7f

Browse files
authored
release: 2.0.0 (#360)
2 parents ae93f2c + 60eaf8f commit 18b7a7f

File tree

9 files changed

+67
-3
lines changed

9 files changed

+67
-3
lines changed

โ€Žsrc/main/kotlin/org/gitanimals/core/advice/GlobalExceptionHandler.ktโ€Ž

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import org.slf4j.LoggerFactory
66
import org.springframework.http.HttpStatus
77
import org.springframework.http.ResponseEntity
88
import org.springframework.web.bind.MissingRequestHeaderException
9+
import org.springframework.web.bind.MissingServletRequestParameterException
910
import org.springframework.web.bind.annotation.ExceptionHandler
1011
import org.springframework.web.bind.annotation.ResponseStatus
1112
import org.springframework.web.bind.annotation.RestControllerAdvice
1213
import org.springframework.web.servlet.NoHandlerFoundException
13-
import java.lang.Exception
1414

1515
@RestControllerAdvice
1616
class 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 {

โ€Žsrc/main/kotlin/org/gitanimals/rank/app/RankQueryFacade.ktโ€Ž

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.gitanimals.rank.domain.RankQueryRepository.RankType.WEEKLY_USER_CONTR
77
import org.gitanimals.rank.domain.UserContributionRankService
88
import org.gitanimals.rank.domain.response.RankResponse
99
import org.slf4j.LoggerFactory
10+
import org.springframework.cache.annotation.Cacheable
1011
import 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
}

โ€Žsrc/main/kotlin/org/gitanimals/rank/controller/RankController.ktโ€Ž

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.gitanimals.rank.controller
33
import org.gitanimals.rank.app.GetRankByUsernameFacade
44
import org.gitanimals.rank.app.RankQueryFacade
55
import org.gitanimals.rank.controller.response.RankHistoryResponse
6+
import org.gitanimals.rank.controller.response.RankTotalCountResponse
67
import org.gitanimals.rank.domain.RankQueryRepository
78
import org.gitanimals.rank.domain.history.RankHistoryService
89
import 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
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.gitanimals.rank.controller.response
2+
3+
data class RankTotalCountResponse(
4+
val count: Int,
5+
)

โ€Žsrc/main/kotlin/org/gitanimals/rank/domain/RankQueryRepository.ktโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff 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,

โ€Žsrc/main/kotlin/org/gitanimals/rank/domain/history/RankHistoryService.ktโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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 }
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
}

โ€Žsrc/main/kotlin/org/gitanimals/rank/infra/RedisRankQueryRepository.ktโ€Ž

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff 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
}

โ€Žsrc/main/kotlin/org/gitanimals/render/infra/CacheConfigurer.ktโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import org.springframework.cache.CacheManager
55
import org.springframework.cache.caffeine.CaffeineCacheManager
66
import org.springframework.context.annotation.Bean
77
import org.springframework.context.annotation.Configuration
8+
import org.springframework.context.annotation.Primary
89
import kotlin.time.Duration.Companion.hours
910
import kotlin.time.toJavaDuration
1011

1112
@Configuration
1213
class CacheConfigurer {
1314

1415
@Bean
16+
@Primary
1517
fun cacheManager(caffeine: Caffeine<Any, Any>): CacheManager {
1618
val caffeineCacheManager = CaffeineCacheManager()
1719
caffeineCacheManager.setCaffeine(caffeine)

0 commit comments

Comments
ย (0)