Fixes for readback

This commit is contained in:
bskjon 2025-02-23 22:30:51 +01:00
parent 5683d23db9
commit 0740242232
2 changed files with 74 additions and 24 deletions

View File

@ -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<out Event> {
}
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<Event>(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<Event>() {}.type
log.error { "Failed to convert event: $eventType and data: $this to proper type!" }
return WGson.gson.fromJson<Event>(this, type)
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<Event> {
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<Event>(json, eventClass)
// 🔥 Sett eventType eksplisitt etter deserialisering
if (event is Event) {
event::class.java.getDeclaredField("eventType").apply {
isAccessible = true
set(event, eventType)
}
}
return event
}
}
}

View File

@ -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)
}