From 06443d7efa8183552cdbfb4d2e357e8754105eb7 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 4 Mar 2025 23:21:06 +0100 Subject: [PATCH] refactoring --- src/main/kotlin/eventDemo/Application.kt | 1 + src/main/kotlin/eventDemo/Configure.kt | 29 --------- .../app/{actions => }/GameCommandHandler.kt | 31 +++++----- ...=> GameEventPlayerNotificationListener.kt} | 7 +-- ...criber.kt => GameEventReactionListener.kt} | 11 ++-- .../eventDemo/{shared => app}/GameId.kt | 4 +- .../eventDemo/{shared => app}/GameState.kt | 12 ++-- .../{readLastPlayedCard => }/HttpRoute.kt | 36 ++++++++--- .../app/actions/playNewCard/HttpRoute.kt | 61 ------------------- .../command/GameCommandStream.kt | 3 +- .../PlayCardCommand.kt | 8 +-- .../eventDemo/{shared => app}/entity/Card.kt | 4 +- .../eventDemo/{shared => app}/entity/Deck.kt | 2 +- .../{shared => app}/entity/Player.kt | 6 +- .../event/CardIsPlayedEvent.kt | 10 +-- .../{shared => app}/event/GameEventBus.kt | 4 +- .../{shared => app}/event/GameEventStream.kt | 4 +- .../{shared => app}/event/GameStateBuilder.kt | 9 +-- .../eventDemo/configuration/Configure.kt | 22 +++++++ .../{plugins => configuration}/HTTP.kt | 2 +- .../{plugins => configuration}/Koin.kt | 6 +- .../{plugins => configuration}/Routing.kt | 8 +-- .../{plugins => configuration}/Security.kt | 3 +- .../Serialization.kt | 6 +- .../{plugins => configuration}/Sockets.kt | 12 ++-- .../kotlin/eventDemo/libs/command/Command.kt | 2 +- .../eventDemo/libs/event/EventStream.kt | 2 +- .../libs/event/EventStreamInMemory.kt | 2 +- .../kotlin/eventDemo/shared/FrameConverter.kt | 4 +- .../kotlin/eventDemo/app/actions/CardTest.kt | 12 ++-- .../eventDemo/app/actions/TestHttpClient.kt | 2 +- 31 files changed, 140 insertions(+), 185 deletions(-) delete mode 100644 src/main/kotlin/eventDemo/Configure.kt rename src/main/kotlin/eventDemo/app/{actions => }/GameCommandHandler.kt (74%) rename src/main/kotlin/eventDemo/app/{actions/GameEventPlayerNotificationSubscriber.kt => GameEventPlayerNotificationListener.kt} (76%) rename src/main/kotlin/eventDemo/app/{actions/GameEventReactionSubscriber.kt => GameEventReactionListener.kt} (71%) rename src/main/kotlin/eventDemo/{shared => app}/GameId.kt (80%) rename src/main/kotlin/eventDemo/{shared => app}/GameState.kt (95%) rename src/main/kotlin/eventDemo/app/actions/{readLastPlayedCard => }/HttpRoute.kt (53%) delete mode 100644 src/main/kotlin/eventDemo/app/actions/playNewCard/HttpRoute.kt rename src/main/kotlin/eventDemo/{shared => app}/command/GameCommandStream.kt (90%) rename src/main/kotlin/eventDemo/app/{actions/playNewCard => command}/PlayCardCommand.kt (86%) rename src/main/kotlin/eventDemo/{shared => app}/entity/Card.kt (97%) rename src/main/kotlin/eventDemo/{shared => app}/entity/Deck.kt (98%) rename src/main/kotlin/eventDemo/{shared => app}/entity/Player.kt (86%) rename src/main/kotlin/eventDemo/{shared => app}/event/CardIsPlayedEvent.kt (89%) rename src/main/kotlin/eventDemo/{shared => app}/event/GameEventBus.kt (68%) rename src/main/kotlin/eventDemo/{shared => app}/event/GameEventStream.kt (87%) rename src/main/kotlin/eventDemo/{shared => app}/event/GameStateBuilder.kt (89%) create mode 100644 src/main/kotlin/eventDemo/configuration/Configure.kt rename src/main/kotlin/eventDemo/{plugins => configuration}/HTTP.kt (96%) rename src/main/kotlin/eventDemo/{plugins => configuration}/Koin.kt (83%) rename src/main/kotlin/eventDemo/{plugins => configuration}/Routing.kt (83%) rename src/main/kotlin/eventDemo/{plugins => configuration}/Security.kt (96%) rename src/main/kotlin/eventDemo/{plugins => configuration}/Serialization.kt (96%) rename src/main/kotlin/eventDemo/{plugins => configuration}/Sockets.kt (81%) diff --git a/src/main/kotlin/eventDemo/Application.kt b/src/main/kotlin/eventDemo/Application.kt index 6a3ec3c..03fac99 100644 --- a/src/main/kotlin/eventDemo/Application.kt +++ b/src/main/kotlin/eventDemo/Application.kt @@ -1,5 +1,6 @@ package eventDemo +import eventDemo.configuration.configure import io.ktor.server.application.Application import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty diff --git a/src/main/kotlin/eventDemo/Configure.kt b/src/main/kotlin/eventDemo/Configure.kt deleted file mode 100644 index 9c88816..0000000 --- a/src/main/kotlin/eventDemo/Configure.kt +++ /dev/null @@ -1,29 +0,0 @@ -package eventDemo - -import eventDemo.app.actions.GameEventReactionSubscriber -import eventDemo.plugins.configureHttp -import eventDemo.plugins.configureHttpRouting -import eventDemo.plugins.configureKoin -import eventDemo.plugins.configureSecurity -import eventDemo.plugins.configureSerialization -import eventDemo.plugins.configureSockets -import eventDemo.plugins.configureWebSocketsGameRoute -import io.ktor.server.application.Application -import org.koin.ktor.ext.get - -fun Application.configure() { - configureKoin() - - configureSecurity() - - configureSerialization() - - configureSockets() - configureWebSocketsGameRoute(get(), get()) - - configureHttp() - configureHttpRouting() - - GameEventReactionSubscriber(get(), get()) - .init() -} diff --git a/src/main/kotlin/eventDemo/app/actions/GameCommandHandler.kt b/src/main/kotlin/eventDemo/app/GameCommandHandler.kt similarity index 74% rename from src/main/kotlin/eventDemo/app/actions/GameCommandHandler.kt rename to src/main/kotlin/eventDemo/app/GameCommandHandler.kt index 4b72936..505ac6d 100644 --- a/src/main/kotlin/eventDemo/app/actions/GameCommandHandler.kt +++ b/src/main/kotlin/eventDemo/app/GameCommandHandler.kt @@ -1,13 +1,14 @@ package eventDemo.app.actions -import eventDemo.app.actions.playNewCard.PlayCardCommand -import eventDemo.shared.command.GameCommandStream -import eventDemo.shared.entity.Player -import eventDemo.shared.event.CardIsPlayedEvent -import eventDemo.shared.event.GameEvent -import eventDemo.shared.event.GameEventStream -import eventDemo.shared.event.GameState -import eventDemo.shared.event.buildStateFromEventStream +import eventDemo.app.GameState +import eventDemo.app.command.GameCommand +import eventDemo.app.command.GameCommandStream +import eventDemo.app.command.PlayCardCommand +import eventDemo.app.entity.Player +import eventDemo.app.event.CardIsPlayedEvent +import eventDemo.app.event.GameEvent +import eventDemo.app.event.GameEventStream +import eventDemo.app.event.buildStateFromEventStream import io.ktor.websocket.Frame import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -17,7 +18,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking /** - * Listen [PlayCardCommand] on [GameCommandStream], check the validity and execute the action. + * Listen [GameCommand] on [GameCommandStream], check the validity and execute an action. * * This action can be executing an action and produce a new [GameEvent] after verification. */ @@ -64,10 +65,10 @@ class GameCommandHandler( } } } -} -private fun GameState.commandCardCanBeExecuted(command: PlayCardCommand): Boolean = - canBePlayThisCard( - command.payload.player, - command.payload.card, - ) + private fun GameState.commandCardCanBeExecuted(command: PlayCardCommand): Boolean = + canBePlayThisCard( + command.payload.player, + command.payload.card, + ) +} diff --git a/src/main/kotlin/eventDemo/app/actions/GameEventPlayerNotificationSubscriber.kt b/src/main/kotlin/eventDemo/app/GameEventPlayerNotificationListener.kt similarity index 76% rename from src/main/kotlin/eventDemo/app/actions/GameEventPlayerNotificationSubscriber.kt rename to src/main/kotlin/eventDemo/app/GameEventPlayerNotificationListener.kt index cb96520..61088f8 100644 --- a/src/main/kotlin/eventDemo/app/actions/GameEventPlayerNotificationSubscriber.kt +++ b/src/main/kotlin/eventDemo/app/GameEventPlayerNotificationListener.kt @@ -1,14 +1,13 @@ -package eventDemo.app.actions +package eventDemo.app +import eventDemo.app.event.GameEvent import eventDemo.libs.event.EventBus -import eventDemo.shared.GameId -import eventDemo.shared.event.GameEvent import eventDemo.shared.toFrame import io.ktor.websocket.Frame import kotlinx.coroutines.channels.SendChannel import kotlinx.coroutines.runBlocking -class GameEventPlayerNotificationSubscriber( +class GameEventPlayerNotificationListener( private val eventBus: EventBus, private val outgoing: SendChannel, ) { diff --git a/src/main/kotlin/eventDemo/app/actions/GameEventReactionSubscriber.kt b/src/main/kotlin/eventDemo/app/GameEventReactionListener.kt similarity index 71% rename from src/main/kotlin/eventDemo/app/actions/GameEventReactionSubscriber.kt rename to src/main/kotlin/eventDemo/app/GameEventReactionListener.kt index 07d29d8..3d3677b 100644 --- a/src/main/kotlin/eventDemo/app/actions/GameEventReactionSubscriber.kt +++ b/src/main/kotlin/eventDemo/app/GameEventReactionListener.kt @@ -1,13 +1,12 @@ -package eventDemo.app.actions +package eventDemo.app +import eventDemo.app.event.GameEvent +import eventDemo.app.event.GameStartedEvent +import eventDemo.app.event.buildStateFromEventStream import eventDemo.libs.event.EventBus import eventDemo.libs.event.EventStream -import eventDemo.shared.GameId -import eventDemo.shared.event.GameEvent -import eventDemo.shared.event.GameStartedEvent -import eventDemo.shared.event.buildStateFromEventStream -class GameEventReactionSubscriber( +class GameEventReactionListener( private val eventBus: EventBus, private val eventStream: EventStream, ) { diff --git a/src/main/kotlin/eventDemo/shared/GameId.kt b/src/main/kotlin/eventDemo/app/GameId.kt similarity index 80% rename from src/main/kotlin/eventDemo/shared/GameId.kt rename to src/main/kotlin/eventDemo/app/GameId.kt index f4c930d..c913b03 100644 --- a/src/main/kotlin/eventDemo/shared/GameId.kt +++ b/src/main/kotlin/eventDemo/app/GameId.kt @@ -1,7 +1,7 @@ -package eventDemo.shared +package eventDemo.app +import eventDemo.configuration.GameIdSerializer import eventDemo.libs.event.AggregateId -import eventDemo.plugins.GameIdSerializer import kotlinx.serialization.Serializable import java.util.UUID diff --git a/src/main/kotlin/eventDemo/shared/GameState.kt b/src/main/kotlin/eventDemo/app/GameState.kt similarity index 95% rename from src/main/kotlin/eventDemo/shared/GameState.kt rename to src/main/kotlin/eventDemo/app/GameState.kt index d789a71..e6b9feb 100644 --- a/src/main/kotlin/eventDemo/shared/GameState.kt +++ b/src/main/kotlin/eventDemo/app/GameState.kt @@ -1,10 +1,11 @@ -package eventDemo.shared.event +package eventDemo.app -import eventDemo.shared.GameId -import eventDemo.shared.entity.Card -import eventDemo.shared.entity.Deck -import eventDemo.shared.entity.Player +import eventDemo.app.entity.Card +import eventDemo.app.entity.Deck +import eventDemo.app.entity.Player +import kotlinx.serialization.Serializable +@Serializable data class GameState( val gameId: GameId, val players: Set = emptySet(), @@ -16,6 +17,7 @@ data class GameState( val deck: Deck = Deck(players.toList()), val isStarted: Boolean = false, ) { + @Serializable data class LastCard( val card: Card, val player: Player, diff --git a/src/main/kotlin/eventDemo/app/actions/readLastPlayedCard/HttpRoute.kt b/src/main/kotlin/eventDemo/app/actions/HttpRoute.kt similarity index 53% rename from src/main/kotlin/eventDemo/app/actions/readLastPlayedCard/HttpRoute.kt rename to src/main/kotlin/eventDemo/app/actions/HttpRoute.kt index 57a1243..959520a 100644 --- a/src/main/kotlin/eventDemo/app/actions/readLastPlayedCard/HttpRoute.kt +++ b/src/main/kotlin/eventDemo/app/actions/HttpRoute.kt @@ -1,10 +1,11 @@ -package eventDemo.app.actions.readLastPlayedCard +package eventDemo.app.actions +import eventDemo.app.GameId +import eventDemo.app.event.CardIsPlayedEvent +import eventDemo.app.event.GameEventStream +import eventDemo.app.event.buildStateFromEventStream +import eventDemo.configuration.GameIdSerializer import eventDemo.libs.event.readLastOf -import eventDemo.plugins.GameIdSerializer -import eventDemo.shared.GameId -import eventDemo.shared.event.CardIsPlayedEvent -import eventDemo.shared.event.GameEventStream import io.ktor.http.HttpStatusCode import io.ktor.resources.Resource import io.ktor.server.application.call @@ -25,6 +26,12 @@ class Game( class Card( val game: Game, ) + + @Serializable + @Resource("state") + class State( + val game: Game, + ) } /** @@ -36,10 +43,25 @@ fun Routing.readLastPlayedCard() { /* * Read the last played card on the game. */ - get { card -> + get { body -> eventStream - .readLastOf(card.game.id) + .readLastOf(body.game.id) ?.let { call.respond(it.card) } ?: call.response.status(HttpStatusCode.BadRequest) } } + +/** + * API route to read the last card played. + */ +fun Routing.readGameState() { + val eventStream by inject() + + /* + * Read the last played card on the game. + */ + get { body -> + val state = body.game.id.buildStateFromEventStream(eventStream) + call.respond(state) + } +} diff --git a/src/main/kotlin/eventDemo/app/actions/playNewCard/HttpRoute.kt b/src/main/kotlin/eventDemo/app/actions/playNewCard/HttpRoute.kt deleted file mode 100644 index 2f2f15c..0000000 --- a/src/main/kotlin/eventDemo/app/actions/playNewCard/HttpRoute.kt +++ /dev/null @@ -1,61 +0,0 @@ -package eventDemo.app.actions.playNewCard - -import eventDemo.libs.command.send -import eventDemo.shared.GameId -import eventDemo.shared.command.GameCommandStreamInMemory -import eventDemo.shared.entity.Card -import eventDemo.shared.entity.Player -import io.ktor.http.HttpStatusCode -import io.ktor.resources.Resource -import io.ktor.server.application.call -import io.ktor.server.auth.authenticate -import io.ktor.server.auth.principal -import io.ktor.server.request.receive -import io.ktor.server.resources.post -import io.ktor.server.response.respondNullable -import io.ktor.server.routing.Routing -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.serialization.Serializable - -@Serializable -@Resource("/game/{id}") -class GameRoute( -// @Serializable(with = GameIdSerializer::class) - val id: GameId, -) { - @Serializable - @Resource("card") - class Card( - val game: GameRoute, - ) -} - -/** - * API route to send a request to play card. - */ -fun Routing.playNewCard() { - val commandStream = GameCommandStreamInMemory() - authenticate { - /* - * A player request to play a new card. - * - * It always returns [HttpStatusCode.OK], but it is not mean that card is already played! - */ - post { - val card = call.receive() - val name = call.principal()!! - launch(Dispatchers.Default) { - commandStream.send( - PlayCardCommand( - it.game.id, - name, - card, - ), - ) - } - - call.respondNullable(HttpStatusCode.OK, null) - } - } -} diff --git a/src/main/kotlin/eventDemo/shared/command/GameCommandStream.kt b/src/main/kotlin/eventDemo/app/command/GameCommandStream.kt similarity index 90% rename from src/main/kotlin/eventDemo/shared/command/GameCommandStream.kt rename to src/main/kotlin/eventDemo/app/command/GameCommandStream.kt index cdfa754..56ea921 100644 --- a/src/main/kotlin/eventDemo/shared/command/GameCommandStream.kt +++ b/src/main/kotlin/eventDemo/app/command/GameCommandStream.kt @@ -1,6 +1,5 @@ -package eventDemo.shared.command +package eventDemo.app.command -import eventDemo.app.actions.playNewCard.GameCommand import eventDemo.libs.command.CommandStream import eventDemo.libs.command.CommandStreamChannel import eventDemo.libs.command.CommandStreamInMemory diff --git a/src/main/kotlin/eventDemo/app/actions/playNewCard/PlayCardCommand.kt b/src/main/kotlin/eventDemo/app/command/PlayCardCommand.kt similarity index 86% rename from src/main/kotlin/eventDemo/app/actions/playNewCard/PlayCardCommand.kt rename to src/main/kotlin/eventDemo/app/command/PlayCardCommand.kt index f02e337..153ff05 100644 --- a/src/main/kotlin/eventDemo/app/actions/playNewCard/PlayCardCommand.kt +++ b/src/main/kotlin/eventDemo/app/command/PlayCardCommand.kt @@ -1,10 +1,10 @@ -package eventDemo.app.actions.playNewCard +package eventDemo.app.command +import eventDemo.app.GameId +import eventDemo.app.entity.Card +import eventDemo.app.entity.Player import eventDemo.libs.command.Command import eventDemo.libs.command.CommandId -import eventDemo.shared.GameId -import eventDemo.shared.entity.Card -import eventDemo.shared.entity.Player import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/eventDemo/shared/entity/Card.kt b/src/main/kotlin/eventDemo/app/entity/Card.kt similarity index 97% rename from src/main/kotlin/eventDemo/shared/entity/Card.kt rename to src/main/kotlin/eventDemo/app/entity/Card.kt index c192458..03238b8 100644 --- a/src/main/kotlin/eventDemo/shared/entity/Card.kt +++ b/src/main/kotlin/eventDemo/app/entity/Card.kt @@ -1,6 +1,6 @@ -package eventDemo.shared.entity +package eventDemo.app.entity -import eventDemo.plugins.UUIDSerializer +import eventDemo.configuration.UUIDSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import java.util.UUID diff --git a/src/main/kotlin/eventDemo/shared/entity/Deck.kt b/src/main/kotlin/eventDemo/app/entity/Deck.kt similarity index 98% rename from src/main/kotlin/eventDemo/shared/entity/Deck.kt rename to src/main/kotlin/eventDemo/app/entity/Deck.kt index 092834a..c5601d0 100644 --- a/src/main/kotlin/eventDemo/shared/entity/Deck.kt +++ b/src/main/kotlin/eventDemo/app/entity/Deck.kt @@ -1,4 +1,4 @@ -package eventDemo.shared.entity +package eventDemo.app.entity import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/eventDemo/shared/entity/Player.kt b/src/main/kotlin/eventDemo/app/entity/Player.kt similarity index 86% rename from src/main/kotlin/eventDemo/shared/entity/Player.kt rename to src/main/kotlin/eventDemo/app/entity/Player.kt index 592b92a..662a419 100644 --- a/src/main/kotlin/eventDemo/shared/entity/Player.kt +++ b/src/main/kotlin/eventDemo/app/entity/Player.kt @@ -1,8 +1,8 @@ -package eventDemo.shared.entity +package eventDemo.app.entity +import eventDemo.configuration.PlayerIdSerializer +import eventDemo.configuration.UUIDSerializer import eventDemo.libs.event.AggregateId -import eventDemo.plugins.PlayerIdSerializer -import eventDemo.plugins.UUIDSerializer import io.ktor.server.auth.Principal import kotlinx.serialization.Serializable import java.util.UUID diff --git a/src/main/kotlin/eventDemo/shared/event/CardIsPlayedEvent.kt b/src/main/kotlin/eventDemo/app/event/CardIsPlayedEvent.kt similarity index 89% rename from src/main/kotlin/eventDemo/shared/event/CardIsPlayedEvent.kt rename to src/main/kotlin/eventDemo/app/event/CardIsPlayedEvent.kt index 4e84074..0662a79 100644 --- a/src/main/kotlin/eventDemo/shared/event/CardIsPlayedEvent.kt +++ b/src/main/kotlin/eventDemo/app/event/CardIsPlayedEvent.kt @@ -1,10 +1,10 @@ -package eventDemo.shared.event +package eventDemo.app.event +import eventDemo.app.GameId +import eventDemo.app.entity.Card +import eventDemo.app.entity.Deck +import eventDemo.app.entity.Player import eventDemo.libs.event.Event -import eventDemo.shared.GameId -import eventDemo.shared.entity.Card -import eventDemo.shared.entity.Deck -import eventDemo.shared.entity.Player import kotlinx.serialization.Serializable /** diff --git a/src/main/kotlin/eventDemo/shared/event/GameEventBus.kt b/src/main/kotlin/eventDemo/app/event/GameEventBus.kt similarity index 68% rename from src/main/kotlin/eventDemo/shared/event/GameEventBus.kt rename to src/main/kotlin/eventDemo/app/event/GameEventBus.kt index f6e0287..5cb7749 100644 --- a/src/main/kotlin/eventDemo/shared/event/GameEventBus.kt +++ b/src/main/kotlin/eventDemo/app/event/GameEventBus.kt @@ -1,7 +1,7 @@ -package eventDemo.shared.event +package eventDemo.app.event +import eventDemo.app.GameId import eventDemo.libs.event.EventBus -import eventDemo.shared.GameId class GameEventBus( bus: EventBus, diff --git a/src/main/kotlin/eventDemo/shared/event/GameEventStream.kt b/src/main/kotlin/eventDemo/app/event/GameEventStream.kt similarity index 87% rename from src/main/kotlin/eventDemo/shared/event/GameEventStream.kt rename to src/main/kotlin/eventDemo/app/event/GameEventStream.kt index 453ed3e..09389ac 100644 --- a/src/main/kotlin/eventDemo/shared/event/GameEventStream.kt +++ b/src/main/kotlin/eventDemo/app/event/GameEventStream.kt @@ -1,8 +1,8 @@ -package eventDemo.shared.event +package eventDemo.app.event +import eventDemo.app.GameId import eventDemo.libs.event.EventBus import eventDemo.libs.event.EventStream -import eventDemo.shared.GameId /** * A stream to publish and read the played card event. diff --git a/src/main/kotlin/eventDemo/shared/event/GameStateBuilder.kt b/src/main/kotlin/eventDemo/app/event/GameStateBuilder.kt similarity index 89% rename from src/main/kotlin/eventDemo/shared/event/GameStateBuilder.kt rename to src/main/kotlin/eventDemo/app/event/GameStateBuilder.kt index fc42162..a35ddc4 100644 --- a/src/main/kotlin/eventDemo/shared/event/GameStateBuilder.kt +++ b/src/main/kotlin/eventDemo/app/event/GameStateBuilder.kt @@ -1,8 +1,9 @@ -package eventDemo.shared.event +package eventDemo.app.event +import eventDemo.app.GameId +import eventDemo.app.GameState +import eventDemo.app.entity.Card import eventDemo.libs.event.EventStream -import eventDemo.shared.GameId -import eventDemo.shared.entity.Card fun GameId.buildStateFromEventStream(eventStream: EventStream): GameState = buildStateFromEvents( @@ -61,7 +62,7 @@ private fun GameId.buildStateFromEvents(events: List): GameState = is GameStartedEvent -> { state.copy( lastColor = (event.deck.discard.first() as? Card.ColorCard)?.color, - lastCard = GameState.LastCard(event.deck.discard.first(), event.firstPlayer), + lastCard = eventDemo.app.GameState.LastCard(event.deck.discard.first(), event.firstPlayer), lastPlayer = event.firstPlayer, deck = event.deck, isStarted = true, diff --git a/src/main/kotlin/eventDemo/configuration/Configure.kt b/src/main/kotlin/eventDemo/configuration/Configure.kt new file mode 100644 index 0000000..09316c5 --- /dev/null +++ b/src/main/kotlin/eventDemo/configuration/Configure.kt @@ -0,0 +1,22 @@ +package eventDemo.configuration + +import eventDemo.app.GameEventReactionListener +import io.ktor.server.application.Application +import org.koin.ktor.ext.get + +fun Application.configure() { + configureKoin() + + configureSecurity() + + configureSerialization() + + configureSockets() + configureWebSocketsGameRoute(get(), get()) + + configureHttp() + configureHttpRouting() + + GameEventReactionListener(get(), get()) + .init() +} diff --git a/src/main/kotlin/eventDemo/plugins/HTTP.kt b/src/main/kotlin/eventDemo/configuration/HTTP.kt similarity index 96% rename from src/main/kotlin/eventDemo/plugins/HTTP.kt rename to src/main/kotlin/eventDemo/configuration/HTTP.kt index 7d17ec3..fc22252 100644 --- a/src/main/kotlin/eventDemo/plugins/HTTP.kt +++ b/src/main/kotlin/eventDemo/configuration/HTTP.kt @@ -1,4 +1,4 @@ -package eventDemo.plugins +package eventDemo.configuration import io.ktor.http.HttpHeaders import io.ktor.http.HttpMethod diff --git a/src/main/kotlin/eventDemo/plugins/Koin.kt b/src/main/kotlin/eventDemo/configuration/Koin.kt similarity index 83% rename from src/main/kotlin/eventDemo/plugins/Koin.kt rename to src/main/kotlin/eventDemo/configuration/Koin.kt index 28c114e..82c28db 100644 --- a/src/main/kotlin/eventDemo/plugins/Koin.kt +++ b/src/main/kotlin/eventDemo/configuration/Koin.kt @@ -1,9 +1,9 @@ -package eventDemo.plugins +package eventDemo.configuration +import eventDemo.app.event.GameEventBus +import eventDemo.app.event.GameEventStream import eventDemo.libs.event.EventBusInMemory import eventDemo.libs.event.EventStreamInMemory -import eventDemo.shared.event.GameEventBus -import eventDemo.shared.event.GameEventStream import io.ktor.server.application.Application import io.ktor.server.application.install import org.koin.dsl.module diff --git a/src/main/kotlin/eventDemo/plugins/Routing.kt b/src/main/kotlin/eventDemo/configuration/Routing.kt similarity index 83% rename from src/main/kotlin/eventDemo/plugins/Routing.kt rename to src/main/kotlin/eventDemo/configuration/Routing.kt index 449d95c..cf9dcc4 100644 --- a/src/main/kotlin/eventDemo/plugins/Routing.kt +++ b/src/main/kotlin/eventDemo/configuration/Routing.kt @@ -1,7 +1,7 @@ -package eventDemo.plugins +package eventDemo.configuration -import eventDemo.app.actions.playNewCard.playNewCard -import eventDemo.app.actions.readLastPlayedCard.readLastPlayedCard +import eventDemo.app.actions.readGameState +import eventDemo.app.actions.readLastPlayedCard import io.ktor.http.HttpStatusCode import io.ktor.server.application.Application import io.ktor.server.application.install @@ -24,7 +24,7 @@ fun Application.configureHttpRouting() { } routing { - playNewCard() readLastPlayedCard() + readGameState() } } diff --git a/src/main/kotlin/eventDemo/plugins/Security.kt b/src/main/kotlin/eventDemo/configuration/Security.kt similarity index 96% rename from src/main/kotlin/eventDemo/plugins/Security.kt rename to src/main/kotlin/eventDemo/configuration/Security.kt index 4a3e976..9284020 100644 --- a/src/main/kotlin/eventDemo/plugins/Security.kt +++ b/src/main/kotlin/eventDemo/configuration/Security.kt @@ -1,4 +1,4 @@ -package eventDemo.plugins +package eventDemo.configuration import com.auth0.jwt.JWT import com.auth0.jwt.algorithms.Algorithm @@ -9,7 +9,6 @@ import io.ktor.server.auth.authentication import io.ktor.server.auth.jwt.JWTPrincipal import io.ktor.server.auth.jwt.jwt import io.ktor.server.response.respond -import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.routing import java.util.Date diff --git a/src/main/kotlin/eventDemo/plugins/Serialization.kt b/src/main/kotlin/eventDemo/configuration/Serialization.kt similarity index 96% rename from src/main/kotlin/eventDemo/plugins/Serialization.kt rename to src/main/kotlin/eventDemo/configuration/Serialization.kt index 6d51e76..f01be79 100644 --- a/src/main/kotlin/eventDemo/plugins/Serialization.kt +++ b/src/main/kotlin/eventDemo/configuration/Serialization.kt @@ -1,8 +1,8 @@ -package eventDemo.plugins +package eventDemo.configuration +import eventDemo.app.GameId +import eventDemo.app.entity.Player.PlayerId import eventDemo.libs.command.CommandId -import eventDemo.shared.GameId -import eventDemo.shared.entity.Player.PlayerId import io.ktor.serialization.kotlinx.json.json import io.ktor.server.application.Application import io.ktor.server.application.install diff --git a/src/main/kotlin/eventDemo/plugins/Sockets.kt b/src/main/kotlin/eventDemo/configuration/Sockets.kt similarity index 81% rename from src/main/kotlin/eventDemo/plugins/Sockets.kt rename to src/main/kotlin/eventDemo/configuration/Sockets.kt index d965d6c..b04f630 100644 --- a/src/main/kotlin/eventDemo/plugins/Sockets.kt +++ b/src/main/kotlin/eventDemo/configuration/Sockets.kt @@ -1,10 +1,10 @@ -package eventDemo.plugins +package eventDemo.configuration +import eventDemo.app.GameEventPlayerNotificationListener import eventDemo.app.actions.GameCommandHandler -import eventDemo.app.actions.GameEventPlayerNotificationSubscriber -import eventDemo.shared.entity.Player -import eventDemo.shared.event.GameEventBus -import eventDemo.shared.event.GameEventStream +import eventDemo.app.entity.Player +import eventDemo.app.event.GameEventBus +import eventDemo.app.event.GameEventStream import io.ktor.server.application.Application import io.ktor.server.application.ApplicationCall import io.ktor.server.application.install @@ -35,7 +35,7 @@ fun Application.configureWebSocketsGameRoute( authenticate { webSocket("/game") { GameCommandHandler(eventStream, incoming, outgoing).init(call.getPlayer()) - GameEventPlayerNotificationSubscriber(eventBus, outgoing).init() + GameEventPlayerNotificationListener(eventBus, outgoing).init() } } } diff --git a/src/main/kotlin/eventDemo/libs/command/Command.kt b/src/main/kotlin/eventDemo/libs/command/Command.kt index 5f5ec91..999b0c0 100644 --- a/src/main/kotlin/eventDemo/libs/command/Command.kt +++ b/src/main/kotlin/eventDemo/libs/command/Command.kt @@ -1,6 +1,6 @@ package eventDemo.libs.command -import eventDemo.plugins.CommandIdSerializer +import eventDemo.configuration.CommandIdSerializer import kotlinx.serialization.Serializable import java.util.UUID diff --git a/src/main/kotlin/eventDemo/libs/event/EventStream.kt b/src/main/kotlin/eventDemo/libs/event/EventStream.kt index e38b6b1..25b9c6a 100644 --- a/src/main/kotlin/eventDemo/libs/event/EventStream.kt +++ b/src/main/kotlin/eventDemo/libs/event/EventStream.kt @@ -19,7 +19,7 @@ interface EventStream, ID : AggregateId> { fun readLastOf( aggregateId: ID, eventType: KClass, - ): E? + ): R? /** Reads all events associated with a given aggregate ID */ fun readAll(aggregateId: ID): List diff --git a/src/main/kotlin/eventDemo/libs/event/EventStreamInMemory.kt b/src/main/kotlin/eventDemo/libs/event/EventStreamInMemory.kt index 4d76204..e304728 100644 --- a/src/main/kotlin/eventDemo/libs/event/EventStreamInMemory.kt +++ b/src/main/kotlin/eventDemo/libs/event/EventStreamInMemory.kt @@ -37,5 +37,5 @@ class EventStreamInMemory, ID : AggregateId> : EventStream override fun readAll(aggregateId: ID): List = events } -inline fun , ID : AggregateId> EventStreamInMemory.readLastOf(aggregateId: ID): R? = +inline fun , ID : AggregateId> EventStream.readLastOf(aggregateId: ID): R? = readLastOf(aggregateId, R::class) diff --git a/src/main/kotlin/eventDemo/shared/FrameConverter.kt b/src/main/kotlin/eventDemo/shared/FrameConverter.kt index 18a7f92..7974afa 100644 --- a/src/main/kotlin/eventDemo/shared/FrameConverter.kt +++ b/src/main/kotlin/eventDemo/shared/FrameConverter.kt @@ -1,7 +1,7 @@ package eventDemo.shared -import eventDemo.app.actions.playNewCard.GameCommand -import eventDemo.shared.event.GameEvent +import eventDemo.app.command.GameCommand +import eventDemo.app.event.GameEvent import io.ktor.websocket.Frame import io.ktor.websocket.readText import kotlinx.serialization.json.Json diff --git a/src/test/kotlin/eventDemo/app/actions/CardTest.kt b/src/test/kotlin/eventDemo/app/actions/CardTest.kt index 0b108cb..e6c4e4a 100644 --- a/src/test/kotlin/eventDemo/app/actions/CardTest.kt +++ b/src/test/kotlin/eventDemo/app/actions/CardTest.kt @@ -1,11 +1,11 @@ package eventDemo.app.actions -import eventDemo.configure -import eventDemo.shared.GameId -import eventDemo.shared.entity.Card -import eventDemo.shared.entity.Player -import eventDemo.shared.event.CardIsPlayedEvent -import eventDemo.shared.event.GameEventStream +import eventDemo.app.GameId +import eventDemo.app.entity.Card +import eventDemo.app.entity.Player +import eventDemo.app.event.CardIsPlayedEvent +import eventDemo.app.event.GameEventStream +import eventDemo.configuration.configure import io.kotest.core.spec.style.FunSpec import io.ktor.client.call.body import io.ktor.client.request.accept diff --git a/src/test/kotlin/eventDemo/app/actions/TestHttpClient.kt b/src/test/kotlin/eventDemo/app/actions/TestHttpClient.kt index a4716cf..06859e4 100644 --- a/src/test/kotlin/eventDemo/app/actions/TestHttpClient.kt +++ b/src/test/kotlin/eventDemo/app/actions/TestHttpClient.kt @@ -1,6 +1,6 @@ package eventDemo.app.actions -import eventDemo.plugins.UUIDSerializer +import eventDemo.configuration.UUIDSerializer import io.ktor.client.HttpClient import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.serialization.kotlinx.json.json