This commit is contained in:
Brage Skjønborg 2025-10-13 23:39:51 +02:00
parent ceeeddefa1
commit b7552dbc67
6 changed files with 21 additions and 14 deletions

View File

@ -8,7 +8,7 @@ import java.util.UUID
class EventDispatcher(val eventStore: EventStore) {
fun dispatch(referenceId: UUID, events: List<Event>) {
val derivedFromIds = events.mapNotNull { it.metadata.derivedFromId }.toSet()
val derivedFromIds = events.mapNotNull { it.metadata.derivedFromId }.flatten().toSet()
val deletedEventIds = events.filterIsInstance<DeleteEvent>().map { it.deletedEventId }
val candidates = events
.filter { it.eventId !in derivedFromIds }

View File

@ -15,12 +15,12 @@ abstract class Event {
fun producedFrom(task: Task): Event = self<Event>().apply {
referenceId = task.referenceId
metadata = Metadata(derivedFromId = task.taskId)
metadata = Metadata().derivedFromEventId(task.taskId)
}
fun derivedOf(event: Event) = self<Event>().apply {
referenceId = event.referenceId
metadata = Metadata(derivedFromId = event.eventId)
fun derivedOf(vararg event: Event) = self<Event>().apply {
referenceId = event.first().referenceId
metadata = Metadata().derivedFromEventId(*event.map { it.eventId }.toTypedArray())
}
fun newReferenceId() = self<Event>().apply {

View File

@ -3,7 +3,11 @@ package no.iktdev.eventi.models
import java.time.LocalDateTime
import java.util.UUID
open class Metadata(
val created: LocalDateTime = LocalDateTime.now(),
val derivedFromId: UUID? = null
) {}
class Metadata {
val created: LocalDateTime = LocalDateTime.now()
var derivedFromId: Set<UUID>? = null
private set
fun derivedFromEventId(vararg id: UUID) = apply {
derivedFromId = id.toSet()
}
}

View File

@ -20,7 +20,7 @@ abstract class Task {
fun derivedOf(event: Event) = self<Task>().apply {
referenceId = event.referenceId
metadata = Metadata(derivedFromId = event.eventId)
metadata = Metadata().derivedFromEventId(event.eventId)
}
}

View File

@ -9,6 +9,7 @@ import no.iktdev.eventi.events.EventTypeRegistry
import no.iktdev.eventi.models.DeleteEvent
import no.iktdev.eventi.models.Event
import no.iktdev.eventi.testUtil.wipe
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotNull
@ -52,7 +53,8 @@ class EventDispatcherTest: TestBase() {
assertNotNull(produced)
val event = produced!!.toEvent()
assertEquals(trigger.eventId, event!!.metadata.derivedFromId)
assertThat(event!!.metadata.derivedFromId).hasSize(1)
assertThat(event!!.metadata.derivedFromId).contains(trigger.eventId)
assertTrue(event is DerivedEvent)
}

View File

@ -1,11 +1,13 @@
package no.iktdev.eventi.tasks
import io.mockk.mockk
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import no.iktdev.eventi.InMemoryTaskStore
import no.iktdev.eventi.TestBase
import no.iktdev.eventi.events.EventListener
import no.iktdev.eventi.events.EventTypeRegistry
import no.iktdev.eventi.models.Event
import no.iktdev.eventi.models.Task
@ -58,8 +60,6 @@ class AbstractTaskPollerTest : TestBase() {
open class EchoListener : TaskListener(TaskType.MIXED) {
var result: Event? = null
override var reporter: TaskReporter? = null
override fun getWorkerId() = this.javaClass.simpleName
override fun supports(task: Task): Boolean {
@ -98,7 +98,8 @@ class AbstractTaskPollerTest : TestBase() {
advanceUntilIdle()
val producedEvent = eventDeferred.await()
assertThat(producedEvent).isNotNull
assertThat(producedEvent.metadata.derivedFromId).isEqualTo(task.taskId)
assertThat(producedEvent.metadata.derivedFromId).hasSize(1)
assertThat(producedEvent.metadata.derivedFromId).contains(task.taskId)
assertThat((listener.result as EchoEvent).data).isEqualTo("Hello Potetmos")
}