Migrated to instant

This commit is contained in:
Brage Skjønborg 2026-01-23 01:13:11 +01:00
parent ab21fc76d9
commit a86347aaa5
14 changed files with 45 additions and 50 deletions

View File

@ -2,18 +2,18 @@ package no.iktdev.mediaprocessing.coordinator.services
import no.iktdev.eventi.ZDS.toEvent
import no.iktdev.eventi.models.store.PersistedEvent
import no.iktdev.mediaprocessing.shared.common.LocalDateTimeEpoch
import no.iktdev.mediaprocessing.shared.common.dto.SequenceSummary
import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.CollectedEvent
import no.iktdev.mediaprocessing.shared.common.projection.CollectProjection
import no.iktdev.mediaprocessing.shared.database.stores.EventStore
import org.springframework.stereotype.Service
import java.time.Instant
@Service
class SequenceAggregatorService() {
fun getActiveSequences(): List<SequenceSummary> {
val allEvents = EventStore.getPersistedEventsAfter(LocalDateTimeEpoch)
val allEvents = EventStore.getPersistedEventsAfter(Instant.EPOCH)
// Gruppér først, deserialiser senere
val grouped = allEvents.groupBy { it.referenceId }
@ -26,7 +26,7 @@ class SequenceAggregatorService() {
}
fun getRecentSequences(limit: Int): List<SequenceSummary> {
val allEvents = EventStore.getPersistedEventsAfter(LocalDateTimeEpoch)
val allEvents = EventStore.getPersistedEventsAfter(Instant.EPOCH)
val grouped = allEvents.groupBy { it.referenceId }

View File

@ -2,9 +2,8 @@ from datetime import datetime, timezone
def utc_now():
"""
Returnerer en UTC-basert LocalDateTime uten Z eller offset,
med nanosekund-lignende presisjon (mikrosekunder + padding).
Matcher nøyaktig formatet Kotlin/Exposed skriver til databasen:
yyyy-MM-dd HH:mm:ss.SSSSSS (UTC)
"""
dt = datetime.now(timezone.utc).replace(tzinfo=None)
return dt.strftime("%Y-%m-%dT%H:%M:%S.") + f"{dt.microsecond:06d}000"
dt = datetime.now(timezone.utc)
return dt.strftime("%Y-%m-%d %H:%M:%S.%f")

View File

@ -2,9 +2,8 @@ from datetime import datetime, timezone
def utc_now():
"""
Returnerer en UTC-basert LocalDateTime uten Z eller offset,
med nanosekund-lignende presisjon (mikrosekunder + padding).
Matcher nøyaktig formatet Kotlin/Exposed skriver til databasen:
yyyy-MM-dd HH:mm:ss.SSSSSS (UTC)
"""
dt = datetime.now(timezone.utc).replace(tzinfo=None)
return dt.strftime("%Y-%m-%dT%H:%M:%S.") + f"{dt.microsecond:06d}000"
dt = datetime.now(timezone.utc)
return dt.strftime("%Y-%m-%d %H:%M:%S.%f")

View File

@ -1,5 +1,5 @@
[versions]
eventi = "1.0-rc29"
eventi = "1.0-rc30"
exfl = "1.0-rc1"
[libraries]

View File

@ -10,8 +10,7 @@ import java.io.FileInputStream
import java.io.RandomAccessFile
import java.net.InetAddress
import java.security.MessageDigest
import java.time.Clock
import java.time.LocalDateTime
import java.time.Instant
import java.util.zip.CRC32
private val logger = KotlinLogging.logger {}
@ -217,9 +216,4 @@ fun File.resolveConflict(): File {
return candidate
}
val LocalDateTimeEpoch: LocalDateTime =
LocalDateTime.of(1970, 1, 1, 0, 0, 0)
fun UtcNow(): LocalDateTime {
return LocalDateTime.now(Clock.systemUTC())
}
fun UtcNow(): Instant = Instant.now()

View File

@ -1,10 +1,10 @@
package no.iktdev.mediaprocessing.shared.common.dto
import java.time.LocalDateTime
import java.time.Instant
data class FileTableItem(
val name: String,
val uri: String,
val checksum: String,
val identifiedAt: LocalDateTime,
val identifiedAt: Instant,
)

View File

@ -2,7 +2,7 @@ package no.iktdev.mediaprocessing.shared.common.dto
import no.iktdev.eventi.models.Event
import no.iktdev.eventi.models.store.PersistedEvent
import java.time.LocalDateTime
import java.time.Instant
import java.util.*
import kotlin.reflect.KProperty1
@ -10,14 +10,14 @@ data class SequenceEvent(
val eventId: UUID,
val referenceId: UUID,
val type: String,
val timestamp: LocalDateTime,
val timestamp: Instant,
val metadata: MetadataDto,
val payload: Map<String, Any?>?
)
data class MetadataDto(
val derivedFromEventIds: Set<UUID>?,
val createdAt: LocalDateTime
val createdAt: Instant
)
fun Event.extractPayload(): Map<String, Any?>? {

View File

@ -1,7 +1,7 @@
package no.iktdev.mediaprocessing.shared.common.dto
import no.iktdev.mediaprocessing.shared.common.projection.CollectProjection
import java.time.LocalDateTime
import java.time.Instant
data class SequenceSummary(
val referenceId: String,
@ -9,7 +9,7 @@ data class SequenceSummary(
val inputFileName: String?,
val type: ContextType = ContextType.Content,
val lastEventId: String,
val lastEventTime: LocalDateTime,
val lastEventTime: Instant,
val metadataTaskStatus: CollectProjection.TaskStatus,
val encodeTaskStatus: CollectProjection.TaskStatus,
val extractTaskStatus: CollectProjection.TaskStatus,

View File

@ -9,11 +9,11 @@ import no.iktdev.mediaprocessing.shared.database.tables.EventsTable
import no.iktdev.mediaprocessing.shared.database.withTransaction
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import java.time.LocalDateTime
import java.time.Instant
import java.util.*
object EventStore: EventStore {
override fun getPersistedEventsAfter(timestamp: LocalDateTime): List<PersistedEvent> {
override fun getPersistedEventsAfter(timestamp: Instant): List<PersistedEvent> {
val result = withTransaction {
EventsTable.selectAll()
.where { EventsTable.persistedAt greater timestamp }

View File

@ -1,17 +1,18 @@
package no.iktdev.mediaprocessing.shared.database.tables
import no.iktdev.mediaprocessing.shared.common.UtcNow
import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.javatime.CurrentDateTime
import org.jetbrains.exposed.sql.javatime.datetime
import java.time.LocalDateTime
import org.jetbrains.exposed.sql.javatime.timestamp
object EventsTable: IntIdTable(name = "EVENTS") {
val referenceId: Column<String> = varchar("REFERENCE_ID", 36)
val eventId: Column<String> = varchar("EVENT_ID", 36)
val event: Column<String> = varchar("EVENT",100)
val data: Column<String> = text("DATA")
val persistedAt: Column<LocalDateTime> = datetime("PERSISTED_AT").defaultExpression(CurrentDateTime)
val persistedAt = timestamp("PERSISTED_AT")
.clientDefault { UtcNow() }
init {
uniqueIndex(referenceId, eventId, event)

View File

@ -2,12 +2,12 @@ package no.iktdev.mediaprocessing.shared.database.tables
import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.javatime.datetime
import java.time.LocalDateTime
import org.jetbrains.exposed.sql.javatime.timestamp
import java.time.Instant
object FilesTable: IntIdTable("FILES") {
val name: Column<String> = varchar("NAME", 255)
val uri: Column<String> = text("URI")
val checksum: Column<String> = char("CHECKSUM", 64)
val identifiedAt: Column<LocalDateTime> = datetime("IDENTIFIED_AT")
val identifiedAt: Column<Instant> = timestamp("IDENTIFIED_AT")
}

View File

@ -1,11 +1,11 @@
package no.iktdev.mediaprocessing.shared.database.tables
import no.iktdev.eventi.models.store.TaskStatus
import no.iktdev.mediaprocessing.shared.common.UtcNow
import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.javatime.CurrentDateTime
import org.jetbrains.exposed.sql.javatime.datetime
import java.time.LocalDateTime
import org.jetbrains.exposed.sql.javatime.timestamp
import java.time.Instant
object TasksTable: IntIdTable(name = "TASKS") {
val referenceId: Column<String> = varchar("REFERENCE_ID", 36)
@ -16,6 +16,7 @@ object TasksTable: IntIdTable(name = "TASKS") {
val claimed: Column<Boolean> = bool("CLAIMED").default(false)
val claimedBy: Column<String?> = varchar("CLAIMED_BY",100).nullable()
val consumed: Column<Boolean> = bool("CONSUMED").default(false)
val lastCheckIn: Column<LocalDateTime?> = datetime("LAST_CHECK_IN").nullable()
val persistedAt: Column<LocalDateTime> = datetime("PERSISTED_AT").defaultExpression(CurrentDateTime)
val lastCheckIn: Column<Instant?> = timestamp("LAST_CHECK_IN").nullable()
val persistedAt = timestamp("PERSISTED_AT")
.clientDefault { UtcNow() }
}

View File

@ -10,6 +10,7 @@ import no.iktdev.mediaprocessing.ffmpeg.decoder.FfmpegProgressDecoder
import no.iktdev.mediaprocessing.ffmpeg.util.UtcNow
import java.io.File
import java.io.FileOutputStream
import java.time.ZoneId
import java.time.format.DateTimeFormatter
open class FFmpeg(val executable: String, val logDir: File) {
@ -20,9 +21,12 @@ open class FFmpeg(val executable: String, val logDir: File) {
private val outputCache = mutableListOf<String>()
//region Log File formatting
val currentDateTime = UtcNow()
val currentDateTime = UtcNow() // Instant, alltid UTC
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd.HH.mm")
val formattedDateTime = currentDateTime.format(formatter)
val formattedDateTime = currentDateTime
.atZone(ZoneId.systemDefault())
.format(formatter)
//endregion
lateinit var logFile: File

View File

@ -1,8 +1,5 @@
package no.iktdev.mediaprocessing.ffmpeg.util
import java.time.Clock
import java.time.LocalDateTime
import java.time.Instant
fun UtcNow(): LocalDateTime {
return LocalDateTime.now(Clock.systemUTC())
}
fun UtcNow(): Instant = Instant.now()