Files
event-demo/src/main/kotlin/eventDemo/libs/event/EventStreamInMemory.kt
Fabrice Lecomte 286dedac76 extract projection snapshot logic
implement GameStateRepositoryTest
add lambda to the GameEventHandler.handle{} to set the version

add VersionBuilder
add version to the events
add creation date to the events
rename gameId to aggregateId
add EventHandler interface
2025-04-14 23:39:41 +02:00

47 lines
1.3 KiB
Kotlin

package eventDemo.libs.event
import io.github.oshai.kotlinlogging.KotlinLogging
import java.util.Queue
import java.util.concurrent.ConcurrentLinkedQueue
import kotlin.reflect.KClass
/**
* An In-Memory implementation of an event stream.
*
* All methods are implemented.
*/
class EventStreamInMemory<E : Event<ID>, ID : AggregateId> : EventStream<E, ID> {
private val logger = KotlinLogging.logger {}
private val events: Queue<E> = ConcurrentLinkedQueue()
override fun publish(event: E) {
events.add(event)
logger.atInfo {
message = "Event published: $event"
payload = mapOf("event" to event)
}
}
override fun publish(vararg events: E) {
events.forEach { publish(it) }
}
override fun readLast(aggregateId: ID): E? = events.lastOrNull()
override fun <R : E> readLastOf(
aggregateId: ID,
eventType: KClass<out R>,
): R? =
events
.filterIsInstance(eventType.java)
.lastOrNull { it.aggregateId == aggregateId }
override fun readAll(aggregateId: ID): Set<E> =
events
.filter { it.aggregateId == aggregateId }
.toSet()
}
inline fun <reified R : E, E : Event<ID>, ID : AggregateId> EventStream<E, ID>.readLastOf(aggregateId: ID): R? =
readLastOf(aggregateId, R::class)