From 0740242232e5d60102e12eee8527830f88f409c4 Mon Sep 17 00:00:00 2001 From: bskjon Date: Sun, 23 Feb 2025 22:30:51 +0100 Subject: [PATCH] Fixes for readback --- .../shared/common/contract/Events.kt | 96 ++++++++++++++----- .../shared/common/DatabaseDeserializerTest.kt | 2 + 2 files changed, 74 insertions(+), 24 deletions(-) diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/Events.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/Events.kt index c221b320..15f7d537 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/Events.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/Events.kt @@ -1,9 +1,13 @@ package no.iktdev.mediaprocessing.shared.common.contract +import com.google.gson.* import com.google.gson.reflect.TypeToken import mu.KotlinLogging +import no.iktdev.eventi.core.LocalDateTimeAdapter import no.iktdev.eventi.core.WGson import no.iktdev.mediaprocessing.shared.common.contract.data.* +import java.lang.reflect.Type +import java.time.LocalDateTime private val log = KotlinLogging.logger {} @@ -11,29 +15,31 @@ private val log = KotlinLogging.logger {} enum class Events(val event: String) { ProcessStarted ("event:media-process:started"), - ReadStreamPerformed ("event:media-read-stream:performed", ), - ParseStreamPerformed ("event:media-parse-stream:performed", ), - ReadBaseInfoPerformed ("event:media-read-base-info:performed", ), - MetadataSearchPerformed ("event:media-metadata-search:performed", ), - ReadOutNameAndType ("event:media-read-out-name-and-type:performed", ), - ReadOutCover ("event:media-read-out-cover:performed", ), - ParameterEncodeCreated ("event:media-encode-parameter:created", ), - ParameterExtractCreated ("event:media-extract-parameter:created", ), - WorkProceedPermitted ("event:media-work-proceed:permitted", ), - WorkEncodeCreated ("event:work-encode:created", ), - WorkExtractCreated ("event:work-extract:created", ), - WorkConvertCreated ("event:work-convert:created", ), - WorkEncodePerformed ("event:work-encode:performed", ), - WorkExtractPerformed ("event:work-extract:performed", ), - WorkConvertPerformed ("event:work-convert:performed", ), - WorkDownloadCoverPerformed ("event:work-download-cover:performed", ), - PersistContentPerformed ("event:media-persist:completed", ), - ProcessCompleted ("event:media-process:completed", ), + ReadStreamPerformed ("event:media-read-stream:performed" ), + ParseStreamPerformed ("event:media-parse-stream:performed" ), + ReadBaseInfoPerformed ("event:media-read-base-info:performed" ), + MetadataSearchPerformed ("event:media-metadata-search:performed" ), + ReadOutNameAndType ("event:media-read-out-name-and-type:performed" ), + ReadOutCover ("event:media-read-out-cover:performed" ), + ParameterEncodeCreated ("event:media-encode-parameter:created" ), + ParameterExtractCreated ("event:media-extract-parameter:created" ), + WorkProceedPermitted ("event:media-work-proceed:permitted" ), + WorkEncodeCreated ("event:work-encode:created" ), + WorkExtractCreated ("event:work-extract:created" ), + WorkConvertCreated ("event:work-convert:created" ), + WorkEncodePerformed ("event:work-encode:performed" ), + WorkExtractPerformed ("event:work-extract:performed" ), + WorkConvertPerformed ("event:work-convert:performed" ), + WorkDownloadCoverPerformed ("event:work-download-cover:performed" ), + PersistContentPerformed ("event:media-persist:completed" ), + ProcessCompleted ("event:media-process:completed" ), + + Unknown ("") ; companion object { - fun toEvent(event: String): Events? { - return Events.entries.find { it.event == event } + fun toEvent(event: String): Events { + return Events.entries.find { it.event == event } ?: Unknown } } } @@ -70,11 +76,14 @@ fun Events.toEventClass(): Class { } fun String.jsonToEvent(eventType: String): Event { - val clazz = Events.toEvent(eventType)?.toEventClass() + val event = Events.toEvent(eventType) + return EventJson.fromJson(this, event) + + /*val clazz = Events.toEvent(eventType)?.toEventClass() clazz.let { eventClass -> try { val type = TypeToken.getParameterized(eventClass).type - return WGson.gson.fromJson(this, type) + return WGson.gson.fromJson(this, type) } catch (e: Exception) { e.printStackTrace() } @@ -90,5 +99,44 @@ fun String.jsonToEvent(eventType: String): Event { // Default val type = object : TypeToken() {}.type log.error { "Failed to convert event: $eventType and data: $this to proper type!" } - return WGson.gson.fromJson(this, type) -} \ No newline at end of file + return WGson.gson.fromJson(this, type)*/ +} + +object EventJson { + private val gson = GsonBuilder() + .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeAdapter()) + .create() + fun fromJson(json: String, event: Events): Event { + val gson = GsonBuilder() + .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeAdapter()) + .registerTypeAdapter(Event::class.java, EventDeserializer(event)) + .create() + return gson.fromJson(json, Event::class.java) + } + + fun toJson(data: Any?): String { + return gson.toJson(data) + } + + class EventDeserializer(private val eventType: Events) : JsonDeserializer { + override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Event { + // 🔥 Finn riktig klasse basert på eventType (som kommer eksternt fra databasen) + val eventClass = eventType.toEventClass() + + // Deserialiser objektet til riktig klasse + val event = context.deserialize(json, eventClass) + + // 🔥 Sett eventType eksplisitt etter deserialisering + if (event is Event) { + event::class.java.getDeclaredField("eventType").apply { + isAccessible = true + set(event, eventType) + } + } + + return event + } + } + + +} diff --git a/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/DatabaseDeserializerTest.kt b/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/DatabaseDeserializerTest.kt index 7f022c41..cf9171fe 100644 --- a/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/DatabaseDeserializerTest.kt +++ b/shared/common/src/test/kotlin/no/iktdev/mediaprocessing/shared/common/DatabaseDeserializerTest.kt @@ -14,6 +14,8 @@ class DatabaseDeserializerTest { val data = """{"metadata":{"eventId":"45e92856-37a6-4266-81cd-a8cf16dd7eb2","referenceId":"a42bf0a4-d31d-4715-8e4d-1432d52f9786","status":"Success","created":"2025-02-10T21:35:52.437791666","source":"Coordinator"},"data":{"type":"FLOW","operations":["ENCODE","EXTRACT","CONVERT"],"file":"/potato"},"eventType":"EventMediaProcessStarted"}""" val result = data.jsonToEvent("event:media-process:started") assertThat(result.data!!.javaClass).hasSameClassAs(StartEventData::class.java) + assertThat(result.eventType).isNotNull() + assertThat(result.eventType).isEqualTo(Events.ProcessStarted) }