From 7d030204f685280448d2485c8baadaf976806a5c Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Sat, 29 Mar 2025 03:31:13 +0100 Subject: [PATCH] use GameEventStoreInPostgresql instead of InMemory --- docker/docker-compose-dev.yaml | 2 +- docker/docker-compose-prod.yaml | 2 +- docker/docker-compose-test.yaml | 2 +- ...nal.yaml => docker-compose-databases.yaml} | 1 + .../event/GameEventStoreInPostgresql.kt | 21 +++++++++++++++++++ .../injection/ConfigureDIInfrastructure.kt | 6 ++++-- ...reamInMemoryTest.kt => EventStreamTest.kt} | 2 +- 7 files changed, 30 insertions(+), 6 deletions(-) rename docker/parts/{docker-compose-external.yaml => docker-compose-databases.yaml} (95%) create mode 100644 src/main/kotlin/eventDemo/adapter/infrastructureLayer/event/GameEventStoreInPostgresql.kt rename src/test/kotlin/eventDemo/libs/event/{EventStreamInMemoryTest.kt => EventStreamTest.kt} (99%) diff --git a/docker/docker-compose-dev.yaml b/docker/docker-compose-dev.yaml index d87a21e..695a652 100644 --- a/docker/docker-compose-dev.yaml +++ b/docker/docker-compose-dev.yaml @@ -1,7 +1,7 @@ name: event-demo-dev include: - path: - - parts/docker-compose-external.yaml + - parts/docker-compose-databases.yaml - parts/docker-compose-tools.yaml - parts/docker-compose-traefik.yaml - envs/docker-compose-dev.yaml diff --git a/docker/docker-compose-prod.yaml b/docker/docker-compose-prod.yaml index 77b2fc4..8a703c7 100644 --- a/docker/docker-compose-prod.yaml +++ b/docker/docker-compose-prod.yaml @@ -1,7 +1,7 @@ name: event-demo-prod include: - path: - - parts/docker-compose-external.yaml + - parts/docker-compose-databases.yaml - parts/docker-compose-tools.yaml - parts/docker-compose-app.yaml - parts/docker-compose-traefik.yaml diff --git a/docker/docker-compose-test.yaml b/docker/docker-compose-test.yaml index 8bf798f..a73510f 100644 --- a/docker/docker-compose-test.yaml +++ b/docker/docker-compose-test.yaml @@ -1,5 +1,5 @@ name: event-demo-test include: - path: - - parts/docker-compose-external.yaml + - parts/docker-compose-databases.yaml - parts/docker-compose-port.yaml \ No newline at end of file diff --git a/docker/parts/docker-compose-external.yaml b/docker/parts/docker-compose-databases.yaml similarity index 95% rename from docker/parts/docker-compose-external.yaml rename to docker/parts/docker-compose-databases.yaml index 7f4ec3b..5581b24 100644 --- a/docker/parts/docker-compose-external.yaml +++ b/docker/parts/docker-compose-databases.yaml @@ -20,6 +20,7 @@ services: postgresql: image: postgres:17.4 + command: postgres -c 'max_connections=500' environment: POSTGRES_PASSWORD_FILE: /run/secrets/postgresql_password POSTGRES_USER: event-demo diff --git a/src/main/kotlin/eventDemo/adapter/infrastructureLayer/event/GameEventStoreInPostgresql.kt b/src/main/kotlin/eventDemo/adapter/infrastructureLayer/event/GameEventStoreInPostgresql.kt new file mode 100644 index 0000000..99f7e49 --- /dev/null +++ b/src/main/kotlin/eventDemo/adapter/infrastructureLayer/event/GameEventStoreInPostgresql.kt @@ -0,0 +1,21 @@ +package eventDemo.adapter.infrastructureLayer.event + +import eventDemo.business.entity.GameId +import eventDemo.business.event.GameEventStore +import eventDemo.business.event.event.GameEvent +import eventDemo.libs.event.EventStore +import eventDemo.libs.event.EventStoreInPostgresql +import kotlinx.serialization.json.Json +import javax.sql.DataSource + +/** + * A stream to publish and read the played card event. + */ +class GameEventStoreInPostgresql( + dataSource: DataSource, +) : GameEventStore, + EventStore by EventStoreInPostgresql( + dataSource, + { Json.encodeToString(it) }, + { Json.decodeFromString(it) }, + ) diff --git a/src/main/kotlin/eventDemo/configuration/injection/ConfigureDIInfrastructure.kt b/src/main/kotlin/eventDemo/configuration/injection/ConfigureDIInfrastructure.kt index 20adc94..dcbb495 100644 --- a/src/main/kotlin/eventDemo/configuration/injection/ConfigureDIInfrastructure.kt +++ b/src/main/kotlin/eventDemo/configuration/injection/ConfigureDIInfrastructure.kt @@ -3,7 +3,7 @@ package eventDemo.configuration.injection import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import eventDemo.adapter.infrastructureLayer.event.GameEventBusInMemory -import eventDemo.adapter.infrastructureLayer.event.GameEventStoreInMemory +import eventDemo.adapter.infrastructureLayer.event.GameEventStoreInPostgresql import eventDemo.adapter.infrastructureLayer.event.projection.GameListRepositoryInMemory import eventDemo.adapter.infrastructureLayer.event.projection.GameProjectionBusInMemory import eventDemo.adapter.infrastructureLayer.event.projection.GameStateRepositoryInRedis @@ -31,13 +31,15 @@ fun Module.configureDIInfrastructure(config: Configuration) { jdbcUrl = config.postgresql.url username = config.postgresql.username password = config.postgresql.password + maximumPoolSize = 50 + minimumIdle = 20 }.let { HikariDataSource(it) } } bind DataSource::class singleOf(::GameEventBusInMemory) bind GameEventBus::class - singleOf(::GameEventStoreInMemory) bind GameEventStore::class + singleOf(::GameEventStoreInPostgresql) bind GameEventStore::class singleOf(::GameProjectionBusInMemory) bind GameProjectionBus::class single { diff --git a/src/test/kotlin/eventDemo/libs/event/EventStreamInMemoryTest.kt b/src/test/kotlin/eventDemo/libs/event/EventStreamTest.kt similarity index 99% rename from src/test/kotlin/eventDemo/libs/event/EventStreamInMemoryTest.kt rename to src/test/kotlin/eventDemo/libs/event/EventStreamTest.kt index 5702f98..2cbccfb 100644 --- a/src/test/kotlin/eventDemo/libs/event/EventStreamInMemoryTest.kt +++ b/src/test/kotlin/eventDemo/libs/event/EventStreamTest.kt @@ -15,7 +15,7 @@ import org.junit.jupiter.api.assertThrows import kotlin.test.assertNotNull @DelicateCoroutinesApi -class EventStreamInMemoryTest : +class EventStreamTest : FunSpec({ fun EventStream.with3Events(block: EventStream.(id: IdTest) -> Unit) = also {