diff --git a/src/main/kotlin/eventDemo/app/command/GameCommandHandler.kt b/src/main/kotlin/eventDemo/app/command/GameCommandHandler.kt index 3bb1dc5..c32ceed 100644 --- a/src/main/kotlin/eventDemo/app/command/GameCommandHandler.kt +++ b/src/main/kotlin/eventDemo/app/command/GameCommandHandler.kt @@ -2,6 +2,7 @@ package eventDemo.app.command import eventDemo.app.GameState import eventDemo.app.command.command.GameCommand +import eventDemo.app.command.command.IWantToJoinTheGameCommand import eventDemo.app.command.command.IWantToPlayCardCommand import eventDemo.app.command.command.IamReadyToPlayCommand import eventDemo.app.entity.Player @@ -42,13 +43,9 @@ class GameCommandHandler( val gameState = command.buildGameState() when (command) { - is IWantToPlayCardCommand -> { - command.run(gameState, playerNotifier, eventStream) - } - - is IamReadyToPlayCommand -> { - command.run(gameState, playerNotifier, eventStream) - } + is IWantToPlayCardCommand -> command.run(gameState, playerNotifier, eventStream) + is IamReadyToPlayCommand -> command.run(gameState, playerNotifier, eventStream) + is IWantToJoinTheGameCommand -> command.run(gameState, playerNotifier, eventStream) } } } diff --git a/src/main/kotlin/eventDemo/app/command/command/IWantToJoinTheGameCommand.kt b/src/main/kotlin/eventDemo/app/command/command/IWantToJoinTheGameCommand.kt new file mode 100644 index 0000000..e772a92 --- /dev/null +++ b/src/main/kotlin/eventDemo/app/command/command/IWantToJoinTheGameCommand.kt @@ -0,0 +1,44 @@ +package eventDemo.app.command.command + +import eventDemo.app.GameState +import eventDemo.app.entity.GameId +import eventDemo.app.entity.Player +import eventDemo.app.event.GameEventStream +import eventDemo.app.event.event.NewPlayerEvent +import eventDemo.libs.command.CommandId +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * A command to perform an action to play a new card + */ +@Serializable +@SerialName("JoinGame") +data class IWantToJoinTheGameCommand( + override val payload: Payload, +) : GameCommand { + override val id: CommandId = CommandId() + + @Serializable + data class Payload( + override val gameId: GameId, + override val player: Player, + ) : GameCommand.Payload + + fun run( + state: GameState, + playerNotifier: (String) -> Unit, + eventStream: GameEventStream, + ) { + if (!state.isStarted) { + eventStream.publish( + NewPlayerEvent( + payload.gameId, + payload.player, + ), + ) + } else { + playerNotifier("The game is already started") + } + } +}