diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicy.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicy.kt index 23dd8ae6..edb01880 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicy.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicy.kt @@ -25,7 +25,15 @@ class CreatorRankingPeriodPolicy { ) } + fun resolveVisibleFromAtUtc(aggregationEndAtKst: LocalDateTime): LocalDateTime { + return aggregationEndAtKst.plusHours(VISIBLE_DELAY_HOURS) + .atZone(KST_ZONE) + .withZoneSameInstant(UTC_ZONE) + .toLocalDateTime() + } + companion object { + private const val VISIBLE_DELAY_HOURS = 9L private val KST_ZONE: ZoneId = ZoneId.of("Asia/Seoul") private val UTC_ZONE: ZoneId = ZoneId.of("UTC") } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingType.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingType.kt new file mode 100644 index 00000000..f0de4dbe --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingType.kt @@ -0,0 +1,5 @@ +package kr.co.vividnext.sodalive.v2.ranking.domain + +enum class CreatorRankingType { + WEEKLY +} diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicyTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicyTest.kt index 331a110a..c1c9d99d 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicyTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/ranking/domain/CreatorRankingPeriodPolicyTest.kt @@ -56,4 +56,14 @@ class CreatorRankingPeriodPolicyTest { assertEquals(LocalDateTime.of(2026, 5, 31, 15, 0), utcRange.startInclusiveUtc) assertEquals(LocalDateTime.of(2026, 6, 7, 15, 0), utcRange.endExclusiveUtc) } + + @Test + @DisplayName("집계 종료일 월요일 09시 KST를 공개 노출 UTC 시각으로 변환한다") + fun shouldResolveVisibleFromAtUtcByAggregationEndAtKst() { + val aggregationEndAtKst = LocalDateTime.of(2026, 6, 8, 0, 0) + + val visibleFromAtUtc = policy.resolveVisibleFromAtUtc(aggregationEndAtKst) + + assertEquals(LocalDateTime.of(2026, 6, 8, 0, 0), visibleFromAtUtc) + } }