Skip to content

Commit

Permalink
Adding default implementation for EventRepository.save(...)
Browse files Browse the repository at this point in the history
  • Loading branch information
idugalic committed Oct 7, 2022
1 parent 55f32b2 commit ba32e42
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ import com.fraktalio.fmodel.domain.examples.numbers.api.NumberCommand
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.EvenNumberEvent
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.OddNumberEvent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.*

/**
* A very simple event store ;) It is initially empty.
Expand All @@ -39,7 +37,6 @@ class NumberRepository : EventRepository<NumberCommand?, NumberEvent?> {


override fun NumberCommand?.fetchEvents(): Flow<NumberEvent?> =

numberEventStorage.asFlow().map { numberEvent ->
when (numberEvent) {
is EvenNumberEvent -> numberEvent
Expand All @@ -48,20 +45,15 @@ class NumberRepository : EventRepository<NumberCommand?, NumberEvent?> {
}
}


override suspend fun NumberEvent?.save(): NumberEvent? {

numberEventStorage = numberEventStorage.plus(this)

return this
override fun Flow<NumberEvent?>.save(): Flow<NumberEvent?> = flow {
numberEventStorage = numberEventStorage.plus(this@save.toList())
emitAll(numberEventStorage.asFlow())
}


fun deleteAll() {
numberEventStorage = emptyList()

}


}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,46 +18,39 @@ package com.fraktalio.fmodel.application.examples.numbers.even.command

import com.fraktalio.fmodel.application.EventRepository
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberCommand.EvenNumberCommand
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.EvenNumberEvent
import kotlinx.coroutines.flow.*

/**
* A very simple event store ;) It is initially empty.
*/
private var evenNumberEventStorage: List<NumberEvent.EvenNumberEvent?> = emptyList()
private var evenNumberEventStorage: List<EvenNumberEvent?> = emptyList()

/**
* Even number repository implementation
*
* @constructor Creates Even number repository
*/
class EvenNumberRepository : EventRepository<EvenNumberCommand?, NumberEvent.EvenNumberEvent?> {

override fun EvenNumberCommand?.fetchEvents(): Flow<NumberEvent.EvenNumberEvent?> =
class EvenNumberRepository : EventRepository<EvenNumberCommand?, EvenNumberEvent?> {

override fun EvenNumberCommand?.fetchEvents(): Flow<EvenNumberEvent?> =
evenNumberEventStorage.asFlow()


override suspend fun NumberEvent.EvenNumberEvent?.save(): NumberEvent.EvenNumberEvent? {

evenNumberEventStorage = evenNumberEventStorage.plus(this)

return this
override fun Flow<EvenNumberEvent?>.save(): Flow<EvenNumberEvent?> = flow {
evenNumberEventStorage = evenNumberEventStorage.plus(this@save.toList())
emitAll(evenNumberEventStorage.asFlow())
}

fun deleteAll() {
evenNumberEventStorage = emptyList()

}

}

/**
* Even number repository
*
* @return event repository instance for Even numbers
*/
fun evenNumberRepository(): EventRepository<EvenNumberCommand?, NumberEvent.EvenNumberEvent?> =
fun evenNumberRepository(): EventRepository<EvenNumberCommand?, EvenNumberEvent?> =
EvenNumberRepository()

Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ package com.fraktalio.fmodel.application.examples.numbers.odd.command
import com.fraktalio.fmodel.application.EventRepository
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberCommand.OddNumberCommand
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.OddNumberEvent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.*

/**
* A very simple event store ;) It is initially empty.
Expand All @@ -37,18 +36,14 @@ class OddNumberRepository : EventRepository<OddNumberCommand?, OddNumberEvent?>
override fun OddNumberCommand?.fetchEvents(): Flow<OddNumberEvent?> =
oddNumberEventStorage.asFlow()


override suspend fun OddNumberEvent?.save(): OddNumberEvent? {
oddNumberEventStorage = oddNumberEventStorage.plus(this)

return this
override fun Flow<OddNumberEvent?>.save(): Flow<OddNumberEvent?> = flow {
oddNumberEventStorage = oddNumberEventStorage.plus(this@save.toList())
emitAll(oddNumberEventStorage.asFlow())
}

fun deleteAll() {
oddNumberEventStorage = emptyList()

}

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@ import com.fraktalio.fmodel.domain.examples.numbers.api.NumberCommand
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.EvenNumberEvent
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.OddNumberEvent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.*

/**
* A very simple event store ;) It is initially empty.
Expand All @@ -37,9 +35,7 @@ private var numberEventStorage: List<NumberEvent?> = emptyList()
*/
class NumberRepository : EventRepository<NumberCommand?, NumberEvent?> {


override fun NumberCommand?.fetchEvents(): Flow<NumberEvent?> =

numberEventStorage.asFlow().map { numberEvent ->
when (numberEvent) {
is EvenNumberEvent -> numberEvent
Expand All @@ -48,20 +44,14 @@ class NumberRepository : EventRepository<NumberCommand?, NumberEvent?> {
}
}


override suspend fun NumberEvent?.save(): NumberEvent? {

numberEventStorage = numberEventStorage.plus(this)

return this
override fun Flow<NumberEvent?>.save(): Flow<NumberEvent?> = flow {
numberEventStorage = numberEventStorage.plus(this@save.toList())
emitAll(numberEventStorage.asFlow())
}

fun deleteAll() {
numberEventStorage = emptyList()

}


}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,46 +18,40 @@ package com.fraktalio.fmodel.application.examples.numbers.even.command

import com.fraktalio.fmodel.application.EventRepository
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberCommand.EvenNumberCommand
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.EvenNumberEvent
import kotlinx.coroutines.flow.*

/**
* A very simple event store ;) It is initially empty.
*/
private var evenNumberEventStorage: List<NumberEvent.EvenNumberEvent?> = emptyList()
private var evenNumberEventStorage: List<EvenNumberEvent?> = emptyList()

/**
* Even number repository implementation
*
* @constructor Creates Even number repository
*/
class EvenNumberRepository : EventRepository<EvenNumberCommand?, NumberEvent.EvenNumberEvent?> {

override fun EvenNumberCommand?.fetchEvents(): Flow<NumberEvent.EvenNumberEvent?> =
class EvenNumberRepository : EventRepository<EvenNumberCommand?, EvenNumberEvent?> {

override fun EvenNumberCommand?.fetchEvents(): Flow<EvenNumberEvent?> =
evenNumberEventStorage.asFlow()


override suspend fun NumberEvent.EvenNumberEvent?.save(): NumberEvent.EvenNumberEvent? {

evenNumberEventStorage = evenNumberEventStorage.plus(this)

return this
override fun Flow<EvenNumberEvent?>.save(): Flow<EvenNumberEvent?> = flow {
evenNumberEventStorage = evenNumberEventStorage.plus(this@save.toList())
emitAll(evenNumberEventStorage.asFlow())
}

fun deleteAll() {
evenNumberEventStorage = emptyList()

}

}

/**
* Even number repository
*
* @return event repository instance for Even numbers
*/
fun evenNumberRepository(): EventRepository<EvenNumberCommand?, NumberEvent.EvenNumberEvent?> =
fun evenNumberRepository(): EventRepository<EvenNumberCommand?, EvenNumberEvent?> =
EvenNumberRepository()

Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ package com.fraktalio.fmodel.application.examples.numbers.odd.command
import com.fraktalio.fmodel.application.EventRepository
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberCommand.OddNumberCommand
import com.fraktalio.fmodel.domain.examples.numbers.api.NumberEvent.OddNumberEvent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.*

/**
* A very simple event store ;) It is initially empty.
Expand All @@ -37,18 +36,15 @@ class OddNumberRepository : EventRepository<OddNumberCommand?, OddNumberEvent?>
override fun OddNumberCommand?.fetchEvents(): Flow<OddNumberEvent?> =
oddNumberEventStorage.asFlow()


override suspend fun OddNumberEvent?.save(): OddNumberEvent? {
oddNumberEventStorage = oddNumberEventStorage.plus(this)

return this
override fun Flow<OddNumberEvent?>.save(): Flow<OddNumberEvent?> = flow {
oddNumberEventStorage = oddNumberEventStorage.plus(this@save.toList())
emitAll(oddNumberEventStorage.asFlow())
}

fun deleteAll() {
oddNumberEventStorage = emptyList()

}

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,6 @@ class EventSourcedAggregateActorTest : FunSpec({
val evenDecider = evenNumberDecider()
val evenNumberRepository = evenNumberRepository() as EvenNumberRepository

test("Event-sourced aggregate actor - add even number") {
with(evenDecider) {
evenNumberRepository.deleteAll()

// choosing command `description` hash as a partition key. It is the same for these two commands.
given(evenNumberRepository, { it?.description.hashCode() }) {
whenCommand(
flowOf(
AddEvenNumber(Description("desc"), NumberValue(6)),
AddEvenNumber(Description("desc"), NumberValue(4))
)
)
} thenEventsExactly listOf(
EvenNumberAdded(Description("desc"), NumberValue(6)),
EvenNumberAdded(Description("desc"), NumberValue(4))
)
}
}

test("Event-sourced aggregate actor - add even number - different partition keys") {
with(evenDecider) {
evenNumberRepository.deleteAll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ package com.fraktalio.fmodel.application
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map

/**
* Event repository interface
Expand All @@ -45,15 +44,15 @@ interface EventRepository<C, E> {
* @receiver Event of type [E]
* @return newly saved Event of type [E]
*/
suspend fun E.save(): E
suspend fun E.save(): E = flowOf(this).save().first()

/**
* Save events
*
* @receiver [Flow] of Events of type [E]
* @return newly saved [Flow] of Events of type [E]
*/
fun Flow<E>.save(): Flow<E> = map { it.save() }
fun Flow<E>.save(): Flow<E>
}

/**
Expand Down

0 comments on commit ba32e42

Please sign in to comment.