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) { class EventDispatcher(val eventStore: EventStore) {
fun dispatch(referenceId: UUID, events: List<Event>) { 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 deletedEventIds = events.filterIsInstance<DeleteEvent>().map { it.deletedEventId }
val candidates = events val candidates = events
.filter { it.eventId !in derivedFromIds } .filter { it.eventId !in derivedFromIds }

View File

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

View File

@ -3,7 +3,11 @@ package no.iktdev.eventi.models
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.UUID import java.util.UUID
open class Metadata( class Metadata {
val created: LocalDateTime = LocalDateTime.now(), val created: LocalDateTime = LocalDateTime.now()
val derivedFromId: UUID? = null 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 { fun derivedOf(event: Event) = self<Task>().apply {
referenceId = event.referenceId 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.DeleteEvent
import no.iktdev.eventi.models.Event import no.iktdev.eventi.models.Event
import no.iktdev.eventi.testUtil.wipe 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.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotNull import org.junit.jupiter.api.Assertions.assertNotNull
@ -52,7 +53,8 @@ class EventDispatcherTest: TestBase() {
assertNotNull(produced) assertNotNull(produced)
val event = produced!!.toEvent() 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) assertTrue(event is DerivedEvent)
} }

View File

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