feat(ranking): 관리자 스냅샷 job API를 추가한다

This commit is contained in:
2026-06-09 11:50:56 +09:00
parent 4165c54a28
commit 67225fdc1d
3 changed files with 266 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
package kr.co.vividnext.sodalive.v2.admin.ranking.creator
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobStatus
import org.springframework.format.annotation.DateTimeFormat
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import java.time.LocalDateTime
@RestController
@RequestMapping("/admin/rankings/creators/snapshot-jobs")
@PreAuthorize("hasRole('ADMIN')")
class AdminCreatorRankingSnapshotJobController(
private val service: AdminCreatorRankingSnapshotJobService
) {
@PostMapping
fun createManualJob(
@RequestBody request: AdminCreatorRankingSnapshotJobRequest
): ApiResponse<AdminCreatorRankingSnapshotJobResponse> {
return ApiResponse.ok(service.createManualJob(request))
}
@GetMapping
fun getJobs(
@RequestParam
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
aggregationStartAtUtc: LocalDateTime,
@RequestParam
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
aggregationEndAtUtc: LocalDateTime,
@RequestParam(required = false)
statuses: List<CreatorRankingSnapshotJobStatus>?
): ApiResponse<List<AdminCreatorRankingSnapshotJobResponse>> {
return ApiResponse.ok(
service.getJobs(
aggregationStartAtUtc = aggregationStartAtUtc,
aggregationEndAtUtc = aggregationEndAtUtc,
statuses = statuses ?: CreatorRankingSnapshotJobStatus.values().toList()
)
)
}
@PostMapping("/{jobId}/retry")
fun retry(@PathVariable jobId: Long): ApiResponse<Unit> {
service.retry(jobId)
return ApiResponse.ok(Unit)
}
}

View File

@@ -0,0 +1,40 @@
package kr.co.vividnext.sodalive.v2.admin.ranking.creator
import kr.co.vividnext.sodalive.v2.ranking.application.CreatorRankingSnapshotJobService
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobStatus
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.LocalDateTime
@Service
@Transactional(readOnly = true)
class AdminCreatorRankingSnapshotJobService(
private val jobService: CreatorRankingSnapshotJobService
) {
@Transactional
fun createManualJob(request: AdminCreatorRankingSnapshotJobRequest): AdminCreatorRankingSnapshotJobResponse {
return AdminCreatorRankingSnapshotJobResponse.from(
jobService.createManualJob(
aggregationStartAtUtc = request.aggregationStartAtUtc,
aggregationEndAtUtc = request.aggregationEndAtUtc
)
)
}
fun getJobs(
aggregationStartAtUtc: LocalDateTime,
aggregationEndAtUtc: LocalDateTime,
statuses: List<CreatorRankingSnapshotJobStatus> = CreatorRankingSnapshotJobStatus.values().toList()
): List<AdminCreatorRankingSnapshotJobResponse> {
return jobService.findJobs(
aggregationStartAtUtc = aggregationStartAtUtc,
aggregationEndAtUtc = aggregationEndAtUtc,
statuses = statuses
).map(AdminCreatorRankingSnapshotJobResponse::from)
}
@Transactional
fun retry(jobId: Long) {
jobService.retryFailedJob(jobId)
}
}