feat(home): 크리에이터 랭킹 fallback job 집계를 추가한다

This commit is contained in:
2026-07-10 14:44:29 +09:00
parent 1f944329f4
commit 10020b03d6
4 changed files with 73 additions and 1 deletions

View File

@@ -1,6 +1,8 @@
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingType
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobStatus
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Lock
import org.springframework.data.jpa.repository.Query
@@ -18,4 +20,11 @@ interface CreatorRankingSnapshotJobRepository : JpaRepository<CreatorRankingSnap
aggregationEndAtUtc: LocalDateTime,
statuses: List<CreatorRankingSnapshotJobStatus>
): List<CreatorRankingSnapshotJob>
fun countByRankingTypeAndAggregationStartAtUtcAndAggregationEndAtUtcAndTrigger(
rankingType: CreatorRankingType,
aggregationStartAtUtc: LocalDateTime,
aggregationEndAtUtc: LocalDateTime,
trigger: CreatorRankingSnapshotJobTrigger
): Long
}

View File

@@ -1,8 +1,10 @@
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingType
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobPort
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobRecord
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobStatus
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
import org.springframework.stereotype.Repository
import org.springframework.transaction.annotation.Transactional
import java.time.LocalDateTime
@@ -32,6 +34,20 @@ class DefaultCreatorRankingSnapshotJobRepository(
).map { it.toRecord() }
}
override fun countByRankingTypeAndPeriodAndTrigger(
rankingType: CreatorRankingType,
aggregationStartAtUtc: LocalDateTime,
aggregationEndAtUtc: LocalDateTime,
trigger: CreatorRankingSnapshotJobTrigger
): Long {
return repository.countByRankingTypeAndAggregationStartAtUtcAndAggregationEndAtUtcAndTrigger(
rankingType = rankingType,
aggregationStartAtUtc = aggregationStartAtUtc,
aggregationEndAtUtc = aggregationEndAtUtc,
trigger = trigger
)
}
@Transactional
override fun markProcessing(jobId: Long, processingStartedAt: LocalDateTime): CreatorRankingSnapshotJobRecord? {
val job = repository.findByIdForUpdate(jobId) ?: return null

View File

@@ -14,6 +14,13 @@ interface CreatorRankingSnapshotJobPort {
statuses: List<CreatorRankingSnapshotJobStatus>
): List<CreatorRankingSnapshotJobRecord>
fun countByRankingTypeAndPeriodAndTrigger(
rankingType: CreatorRankingType,
aggregationStartAtUtc: LocalDateTime,
aggregationEndAtUtc: LocalDateTime,
trigger: CreatorRankingSnapshotJobTrigger
): Long
fun markProcessing(jobId: Long, processingStartedAt: LocalDateTime): CreatorRankingSnapshotJobRecord?
fun markDone(jobId: Long, processedAt: LocalDateTime): CreatorRankingSnapshotJobRecord?
@@ -32,7 +39,8 @@ enum class CreatorRankingSnapshotJobStatus {
enum class CreatorRankingSnapshotJobTrigger {
SCHEDULED,
MANUAL
MANUAL,
FALLBACK
}
data class CreatorRankingSnapshotJobRecord(