feat(content-ranking): 스냅샷 job 공개 메타데이터를 저장한다
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
|
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
|
||||||
|
|
||||||
import kr.co.vividnext.sodalive.common.BaseEntity
|
import kr.co.vividnext.sodalive.common.BaseEntity
|
||||||
|
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.CreatorRankingSnapshotJobStatus
|
||||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
@@ -13,12 +14,19 @@ import javax.persistence.Table
|
|||||||
@Entity
|
@Entity
|
||||||
@Table(name = "creator_ranking_snapshot_job")
|
@Table(name = "creator_ranking_snapshot_job")
|
||||||
class CreatorRankingSnapshotJob(
|
class CreatorRankingSnapshotJob(
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
@Column(name = "ranking_type", nullable = false, length = 30)
|
||||||
|
val rankingType: CreatorRankingType,
|
||||||
|
|
||||||
@Column(name = "aggregation_start_at_utc", nullable = false)
|
@Column(name = "aggregation_start_at_utc", nullable = false)
|
||||||
val aggregationStartAtUtc: LocalDateTime,
|
val aggregationStartAtUtc: LocalDateTime,
|
||||||
|
|
||||||
@Column(name = "aggregation_end_at_utc", nullable = false)
|
@Column(name = "aggregation_end_at_utc", nullable = false)
|
||||||
val aggregationEndAtUtc: LocalDateTime,
|
val aggregationEndAtUtc: LocalDateTime,
|
||||||
|
|
||||||
|
@Column(name = "visible_from_at", nullable = false)
|
||||||
|
val visibleFromAtUtc: LocalDateTime,
|
||||||
|
|
||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
@Column(name = "trigger_type", nullable = false, length = 20)
|
@Column(name = "trigger_type", nullable = false, length = 20)
|
||||||
val trigger: CreatorRankingSnapshotJobTrigger,
|
val trigger: CreatorRankingSnapshotJobTrigger,
|
||||||
|
|||||||
@@ -73,8 +73,10 @@ class DefaultCreatorRankingSnapshotJobRepository(
|
|||||||
|
|
||||||
private fun CreatorRankingSnapshotJobRecord.toEntity(): CreatorRankingSnapshotJob {
|
private fun CreatorRankingSnapshotJobRecord.toEntity(): CreatorRankingSnapshotJob {
|
||||||
return CreatorRankingSnapshotJob(
|
return CreatorRankingSnapshotJob(
|
||||||
|
rankingType = rankingType,
|
||||||
aggregationStartAtUtc = aggregationStartAtUtc,
|
aggregationStartAtUtc = aggregationStartAtUtc,
|
||||||
aggregationEndAtUtc = aggregationEndAtUtc,
|
aggregationEndAtUtc = aggregationEndAtUtc,
|
||||||
|
visibleFromAtUtc = visibleFromAtUtc,
|
||||||
trigger = trigger,
|
trigger = trigger,
|
||||||
status = status,
|
status = status,
|
||||||
lastError = lastError,
|
lastError = lastError,
|
||||||
@@ -86,8 +88,10 @@ class DefaultCreatorRankingSnapshotJobRepository(
|
|||||||
private fun CreatorRankingSnapshotJob.toRecord(): CreatorRankingSnapshotJobRecord {
|
private fun CreatorRankingSnapshotJob.toRecord(): CreatorRankingSnapshotJobRecord {
|
||||||
return CreatorRankingSnapshotJobRecord(
|
return CreatorRankingSnapshotJobRecord(
|
||||||
id = id,
|
id = id,
|
||||||
|
rankingType = rankingType,
|
||||||
aggregationStartAtUtc = aggregationStartAtUtc,
|
aggregationStartAtUtc = aggregationStartAtUtc,
|
||||||
aggregationEndAtUtc = aggregationEndAtUtc,
|
aggregationEndAtUtc = aggregationEndAtUtc,
|
||||||
|
visibleFromAtUtc = visibleFromAtUtc,
|
||||||
trigger = trigger,
|
trigger = trigger,
|
||||||
status = status,
|
status = status,
|
||||||
lastError = lastError,
|
lastError = lastError,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package kr.co.vividnext.sodalive.v2.ranking.port.out
|
package kr.co.vividnext.sodalive.v2.ranking.port.out
|
||||||
|
|
||||||
|
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingType
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
interface CreatorRankingSnapshotJobPort {
|
interface CreatorRankingSnapshotJobPort {
|
||||||
@@ -36,8 +37,10 @@ enum class CreatorRankingSnapshotJobTrigger {
|
|||||||
|
|
||||||
data class CreatorRankingSnapshotJobRecord(
|
data class CreatorRankingSnapshotJobRecord(
|
||||||
val id: Long? = null,
|
val id: Long? = null,
|
||||||
|
val rankingType: CreatorRankingType,
|
||||||
val aggregationStartAtUtc: LocalDateTime,
|
val aggregationStartAtUtc: LocalDateTime,
|
||||||
val aggregationEndAtUtc: LocalDateTime,
|
val aggregationEndAtUtc: LocalDateTime,
|
||||||
|
val visibleFromAtUtc: LocalDateTime,
|
||||||
val trigger: CreatorRankingSnapshotJobTrigger,
|
val trigger: CreatorRankingSnapshotJobTrigger,
|
||||||
val status: CreatorRankingSnapshotJobStatus,
|
val status: CreatorRankingSnapshotJobStatus,
|
||||||
val lastError: String?,
|
val lastError: String?,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.v2.admin.ranking.creator
|
|||||||
import kr.co.vividnext.sodalive.common.CountryContext
|
import kr.co.vividnext.sodalive.common.CountryContext
|
||||||
import kr.co.vividnext.sodalive.i18n.LangContext
|
import kr.co.vividnext.sodalive.i18n.LangContext
|
||||||
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
||||||
|
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingType
|
||||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobRecord
|
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.CreatorRankingSnapshotJobStatus
|
||||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
||||||
@@ -160,8 +161,10 @@ class AdminCreatorRankingSnapshotJobControllerTest @Autowired constructor(
|
|||||||
private fun manualJob(status: CreatorRankingSnapshotJobStatus): CreatorRankingSnapshotJobRecord {
|
private fun manualJob(status: CreatorRankingSnapshotJobStatus): CreatorRankingSnapshotJobRecord {
|
||||||
return CreatorRankingSnapshotJobRecord(
|
return CreatorRankingSnapshotJobRecord(
|
||||||
id = 1L,
|
id = 1L,
|
||||||
|
rankingType = CreatorRankingType.WEEKLY,
|
||||||
aggregationStartAtUtc = LocalDateTime.of(2026, 5, 31, 15, 0),
|
aggregationStartAtUtc = LocalDateTime.of(2026, 5, 31, 15, 0),
|
||||||
aggregationEndAtUtc = LocalDateTime.of(2026, 6, 7, 15, 0),
|
aggregationEndAtUtc = LocalDateTime.of(2026, 6, 7, 15, 0),
|
||||||
|
visibleFromAtUtc = LocalDateTime.of(2026, 6, 8, 0, 0),
|
||||||
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
|
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
|
||||||
status = status,
|
status = status,
|
||||||
lastError = if (status == CreatorRankingSnapshotJobStatus.FAILED) "aggregate failed" else null,
|
lastError = if (status == CreatorRankingSnapshotJobStatus.FAILED) "aggregate failed" else null,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
|
package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence
|
||||||
|
|
||||||
import kr.co.vividnext.sodalive.configs.QueryDslConfig
|
import kr.co.vividnext.sodalive.configs.QueryDslConfig
|
||||||
|
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingType
|
||||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobRecord
|
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.CreatorRankingSnapshotJobStatus
|
||||||
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobTrigger
|
||||||
@@ -32,8 +33,10 @@ class DefaultCreatorRankingSnapshotJobRepositoryTest @Autowired constructor(
|
|||||||
|
|
||||||
val saved = adapter.save(
|
val saved = adapter.save(
|
||||||
CreatorRankingSnapshotJobRecord(
|
CreatorRankingSnapshotJobRecord(
|
||||||
|
rankingType = CreatorRankingType.WEEKLY,
|
||||||
aggregationStartAtUtc = startAt,
|
aggregationStartAtUtc = startAt,
|
||||||
aggregationEndAtUtc = endAt,
|
aggregationEndAtUtc = endAt,
|
||||||
|
visibleFromAtUtc = endAt.plusHours(9),
|
||||||
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
|
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
|
||||||
status = CreatorRankingSnapshotJobStatus.PENDING,
|
status = CreatorRankingSnapshotJobStatus.PENDING,
|
||||||
lastError = null,
|
lastError = null,
|
||||||
@@ -54,8 +57,10 @@ class DefaultCreatorRankingSnapshotJobRepositoryTest @Autowired constructor(
|
|||||||
adapter.markDone(savedId, processedAt)
|
adapter.markDone(savedId, processedAt)
|
||||||
val failed = adapter.save(
|
val failed = adapter.save(
|
||||||
CreatorRankingSnapshotJobRecord(
|
CreatorRankingSnapshotJobRecord(
|
||||||
|
rankingType = CreatorRankingType.WEEKLY,
|
||||||
aggregationStartAtUtc = startAt.minusWeeks(1),
|
aggregationStartAtUtc = startAt.minusWeeks(1),
|
||||||
aggregationEndAtUtc = endAt.minusWeeks(1),
|
aggregationEndAtUtc = endAt.minusWeeks(1),
|
||||||
|
visibleFromAtUtc = endAt.minusWeeks(1).plusHours(9),
|
||||||
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
|
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
|
||||||
status = CreatorRankingSnapshotJobStatus.FAILED,
|
status = CreatorRankingSnapshotJobStatus.FAILED,
|
||||||
lastError = "aggregate failed",
|
lastError = "aggregate failed",
|
||||||
@@ -73,6 +78,8 @@ class DefaultCreatorRankingSnapshotJobRepositoryTest @Autowired constructor(
|
|||||||
|
|
||||||
assertEquals(1, jobs.size)
|
assertEquals(1, jobs.size)
|
||||||
assertEquals(CreatorRankingSnapshotJobTrigger.SCHEDULED, jobs.single().trigger)
|
assertEquals(CreatorRankingSnapshotJobTrigger.SCHEDULED, jobs.single().trigger)
|
||||||
|
assertEquals(CreatorRankingType.WEEKLY, jobs.single().rankingType)
|
||||||
|
assertEquals(endAt.plusHours(9), jobs.single().visibleFromAtUtc)
|
||||||
assertEquals(CreatorRankingSnapshotJobStatus.DONE, jobs.single().status)
|
assertEquals(CreatorRankingSnapshotJobStatus.DONE, jobs.single().status)
|
||||||
assertEquals(processingStartedAt, jobs.single().processingStartedAt)
|
assertEquals(processingStartedAt, jobs.single().processingStartedAt)
|
||||||
assertEquals(processedAt, jobs.single().processedAt)
|
assertEquals(processedAt, jobs.single().processedAt)
|
||||||
@@ -86,8 +93,10 @@ class DefaultCreatorRankingSnapshotJobRepositoryTest @Autowired constructor(
|
|||||||
fun shouldMarkFailedSnapshotJobPendingForRetry() {
|
fun shouldMarkFailedSnapshotJobPendingForRetry() {
|
||||||
val saved = adapter.save(
|
val saved = adapter.save(
|
||||||
CreatorRankingSnapshotJobRecord(
|
CreatorRankingSnapshotJobRecord(
|
||||||
|
rankingType = CreatorRankingType.WEEKLY,
|
||||||
aggregationStartAtUtc = LocalDateTime.of(2026, 5, 31, 15, 0),
|
aggregationStartAtUtc = LocalDateTime.of(2026, 5, 31, 15, 0),
|
||||||
aggregationEndAtUtc = LocalDateTime.of(2026, 6, 7, 15, 0),
|
aggregationEndAtUtc = LocalDateTime.of(2026, 6, 7, 15, 0),
|
||||||
|
visibleFromAtUtc = LocalDateTime.of(2026, 6, 8, 0, 0),
|
||||||
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
|
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
|
||||||
status = CreatorRankingSnapshotJobStatus.FAILED,
|
status = CreatorRankingSnapshotJobStatus.FAILED,
|
||||||
lastError = "aggregate failed",
|
lastError = "aggregate failed",
|
||||||
@@ -111,8 +120,10 @@ class DefaultCreatorRankingSnapshotJobRepositoryTest @Autowired constructor(
|
|||||||
fun shouldNotMarkNonFailedSnapshotJobPendingForRetry() {
|
fun shouldNotMarkNonFailedSnapshotJobPendingForRetry() {
|
||||||
val saved = adapter.save(
|
val saved = adapter.save(
|
||||||
CreatorRankingSnapshotJobRecord(
|
CreatorRankingSnapshotJobRecord(
|
||||||
|
rankingType = CreatorRankingType.WEEKLY,
|
||||||
aggregationStartAtUtc = LocalDateTime.of(2026, 5, 31, 15, 0),
|
aggregationStartAtUtc = LocalDateTime.of(2026, 5, 31, 15, 0),
|
||||||
aggregationEndAtUtc = LocalDateTime.of(2026, 6, 7, 15, 0),
|
aggregationEndAtUtc = LocalDateTime.of(2026, 6, 7, 15, 0),
|
||||||
|
visibleFromAtUtc = LocalDateTime.of(2026, 6, 8, 0, 0),
|
||||||
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
|
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
|
||||||
status = CreatorRankingSnapshotJobStatus.DONE,
|
status = CreatorRankingSnapshotJobStatus.DONE,
|
||||||
lastError = null,
|
lastError = null,
|
||||||
|
|||||||
Reference in New Issue
Block a user