This commit is contained in:
2024-05-30 21:41:02 +02:00
parent 03ba14d918
commit ae5c229e4b
32 changed files with 537 additions and 344 deletions

View File

@@ -0,0 +1,43 @@
package eventDemo.libs.event
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlin.reflect.KClass
abstract class EventStreamInMemory<E : Event<ID>, ID : AggregateId>(
private val eventType: Class<E>,
) : EventStream<E, ID> {
private val logger = KotlinLogging.logger {}
private val eventBus: MutableList<E> = mutableListOf()
override fun publish(event: E) {
eventBus.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? = eventBus.lastOrNull()
override fun <R : E> readLastOf(
aggregateId: ID,
eventType: KClass<out R>,
): R? =
eventBus
.filterIsInstance(eventType.java)
.lastOrNull { it.id == aggregateId }
override fun readAll(aggregateId: ID): Flow<E> =
flow {
eventBus.forEach { emit(it) }
}
}
inline fun <reified R : E, E : Event<ID>, ID : AggregateId> EventStreamInMemory<E, ID>.readLastOf(aggregateId: ID): R? =
readLastOf(aggregateId, R::class)