diff --git a/doc/architecture.md b/doc/architecture.md deleted file mode 100644 index 18aca17..0000000 --- a/doc/architecture.md +++ /dev/null @@ -1,11 +0,0 @@ -Architecture -============ - -The Workflow ------------- -![Workflow Diagram](./schemas/Workflow.svg) - -The business Entities ---------------------- - -![Entities and Projections Diagram](./schemas/Entities.svg) diff --git a/doc/files-structure.md b/doc/files-structure.md deleted file mode 100644 index 5cd8a1d..0000000 --- a/doc/files-structure.md +++ /dev/null @@ -1,67 +0,0 @@ -# Exemple de structure - -Les couches, du plus interne au plus externe -``` -Domain (le cœur, ne dépend de RIEN d'externe) -↑ -Application (orchestre le Domain, ne connaît pas l'infra concrète) -↑ -Infrastructure (WebSocket, DB, event store — dépend de tout le reste) -``` - -``` -src/ -└── contexts/ - ├── auth/ - └── ... - └── game/ - ├── domain/ ← Le cœur métier, zéro dépendance externe - │ ├── game/ - │ │ ├── Game.ts ← Aggregate Root - │ │ ├── Player.ts ← Entity interne - │ │ ├── Card.ts ← Entity - │ │ ├── Color.ts ← Value Object - │ │ ├── Deck.ts ← VO ou petite structure - │ │ └── errors/ - │ │ ├── InvalidMoveError.ts - │ │ └── ColorChoiceRequiredError.ts - │ └── events/ ← Events de DOMAINE (internes) - │ ├── CardPlayed.ts - │ ├── CardDrawn.ts - │ ├── TurnPassed.ts - │ └── DomainEvent.ts ← interface/type de base - ├── application/ ← Orchestration, cas d'usage - │ ├── commands/ ← Les Commandes (intentions) - │ │ ├── PlayCardCommand.ts - │ │ └── DrawCardCommand.ts - │ ├── handlers/ ← Un handler par commande - │ │ ├── PlayCardHandler.ts ← charge l'aggregate, appelle game.playCard(), save - │ │ └── DrawCardHandler.ts - │ ├── projections/ ← LA LOGIQUE de construction des projections - │ │ ├── GameSummaryProjector.kt ← écoute les events, met à jour la vue - │ │ └── PlayerStatsProjector.kt - │ └── ports/ ← INTERFACES seulement (le "hexagone") - │ ├── GameRepository.ts ← interface, pas d'implémentation - │ ├── EventPublisher.ts ← interface, pas d'implémentation - │ └── ProjectionStore.kt ← interface, où lire/écrire la projection - ├── infrastructure/ ← Tout ce qui est technique/externe - │ ├── persistence/ - │ │ ├── EventStoreGameRepository.ts ← implémente GameRepository - │ │ ├── EventStore.ts - │ │ ├── projections/ - │ │ │ ├── GameSummaryProjectionStore.kt ← implémentation concrète (DB, table dédiée) - │ │ │ └── models/ - │ │ │ └── GameSummaryView.kt ← structure de la vue elle-même - │ ├── websocket/ - │ │ ├── WebSocketServer.ts - │ │ ├── connectionManager.ts ← Map> - │ │ └── commandRouter.ts ← reçoit le message brut, dispatch vers le bon handler - │ └── eventPublisher/ - │ └── WebSocketEventPublisher.ts ← implémente EventPublisher, fait le broadcast - └── presentation/ ← Traduction vers/depuis le client (le fameux DTO layer) - ├── clientEvents/ - │ ├── ClientEvent.ts ← types des events envoyés au front - │ └── toClientEvent.ts ← fonction de traduction domain event → client event - └── clientCommands/ - └── parseIncomingCommand.ts ← valide/parse le message brut du client → Command -``` \ No newline at end of file diff --git a/doc/installation.md b/doc/installation.md index 01eecca..7a55f14 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -23,7 +23,7 @@ Api url: - [Backend API](http://api.traefik.me/) - [Frontend web site](http://app.traefik.me/) (WIP) -Exposed url on test env: +Exposed url on dev env: - [PostgreSql](http://localhost:5432/) - [Redis](http://localhost:6379/) - [RabbitMQ](http://localhost:15672/) diff --git a/doc/schemas/Entities.puml b/doc/schemas/Entities.puml deleted file mode 100644 index c72c7a7..0000000 --- a/doc/schemas/Entities.puml +++ /dev/null @@ -1,93 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -left to right direction - -class GameList <> { - + status: Status -} -class GameState <> { - + players: List - + currentPlayerTurn: Player - + lastCardPlayer: Player - + colorOnCurrentStack: Color - + direction: Direction - + readyPlayers: List - + deck: Deck - + isStarted: Boolean - + playerWins: List -} -interface Card { - + id: UUID -} -enum Color { - + Blue - + Red - + Yellow - + Green -} -class GameId { - + id: UUID -} -class Player { - + id: PlayerId - + name: String -} -class Deck { - + stack: Stack - + discard: Discard - + playersHands: PlayersHands -} -class Stack { - + cards: List - + shuffle() -} -class Discard { - + cards: List -} -class PlayerHands { - + map: Map> -} - -class NumericCard { - + number: Int - + color: Color -} -class ReverseCard { - + color: Color -} -class PassCard { - + color: Color -} -class Plus2Card { - + color: Color -} -class Plus4Card -class ChangeColorCard - -GameState *-- Deck -GameState o-- "many" Player -Deck *-- PlayerHands -PlayerHands *-- "many" Card -PlayerHands o-- "many" Player -Stack *-- "many" Card -Discard *-- "many" Card -Deck *-- Stack -Deck *-- Discard -GameState *-- GameId -Card <|--- NumericCard -Card <|--- ReverseCard -Card <|--- PassCard -Card <|--- ChangeColorCard -Card <|--- Plus2Card -Card <|--- Plus4Card - -ReverseCard o-- Color -NumericCard o-- Color -PassCard o-- Color -Plus2Card o-- Color - -GameList *-- GameId -GameList o-- "many" Player - -@enduml \ No newline at end of file diff --git a/doc/schemas/Entities.svg b/doc/schemas/Entities.svg deleted file mode 100644 index ca1e614..0000000 --- a/doc/schemas/Entities.svg +++ /dev/null @@ -1 +0,0 @@ -«Projection»GameListstatus: Status«Projection»GameStateplayers: List<Player>currentPlayerTurn: PlayerlastCardPlayer: PlayercolorOnCurrentStack: Colordirection: DirectionreadyPlayers: List<Player>deck: DeckisStarted: BooleanplayerWins: List<Player>Cardid: UUIDColorBlueRedYellowGreenGameIdid: UUIDPlayerid: PlayerIdname: StringDeckstack: Stackdiscard: DiscardplayersHands: PlayersHandsStackcards: List<Card>shuffle()Discardcards: List<Card>PlayerHandsmap: Map<PlayerId, List<Card>>NumericCardnumber: Intcolor: ColorReverseCardcolor: ColorPassCardcolor: ColorPlus2Cardcolor: ColorPlus4CardChangeColorCardmanymanymanymanymanymany \ No newline at end of file diff --git a/doc/schemas/Workflow.puml b/doc/schemas/Workflow.puml deleted file mode 100644 index 6cbb402..0000000 --- a/doc/schemas/Workflow.puml +++ /dev/null @@ -1,84 +0,0 @@ -@startuml -'https://plantuml.com/use-case-diagram - -package Legend { - usecase (Queries) #7693C4 - usecase (Projections) #AB64C9 - usecase (Events) #5FAD56 -} - -actor User -entity Query #7693C4 - -entity Command #5FAD56 -entity Event #5FAD56 -entity Projection #AB64C9 - -database Postgresql -database Redis -queue RabbitMQ - -usecase (Web socket adapter) #5FAD56 -usecase (Command handler) #5FAD56 -usecase/ (Action) #5FAD56 -usecase (Event handler) #5FAD56 -usecase (Version builder) #5FAD56 -usecase (Event store) #5FAD56 -usecase (Event stream) #5FAD56 -usecase (Event bus) #5FAD56 -usecase/ (Reaction listener) #5FAD56 - -usecase/ (Projection builder) #AB64C9 -usecase (Projection repository) #AB64C9 -usecase (Projection bus) #AB64C9 - -usecase (Controller) #7693C4 - -User -> Query : <> -Command <- User : <> -User ---> (Controller) : Get \nprojection -User <-- (Controller) : Returns \nprojection - -(Controller) --------> (Projection repository) : Get \nprojection - -User -> (Web socket adapter) : Send \ncommand -(Web socket adapter) --> (Command handler) : Send \ncommand -(Web socket adapter) ...> User : Send notification \n(error or success) - -(Command handler) ..> (Web socket adapter) : Send \nnotification -(Command handler) -> (Action) : Execute action -(Command handler) <- (Action) : Returns \nevent builder -(Command handler) ---> (Event handler) : Dispatch \nevent \n(send an event builder) -(Command handler) --> Event : <> - -(Event handler) --> (Event store) : Publish \nevent -(Event handler) <-- (Reaction listener) : Dispatch \n new event -(Version builder) <- (Event handler) : build next version -note "Acquire a lock, \nget the next event version, \nand then, build the event " as EventHandlerNote -EventHandlerNote <-- (Event handler) - -(Event store) -left-> (Event stream) -(Event store) ---> (Event bus) : Publish \nevent - -(Event stream) --> Postgresql : Persist \nevent -(Event bus) -> RabbitMQ : Publish \nevent -(Event bus) -> RabbitMQ : Subscribe \nto event -(Event bus) <. RabbitMQ : Emit event - -(Reaction listener) ---> (Projection bus) : Subscribe -(Reaction listener) <.. (Projection bus) : Emit projection - -(Projection bus) <- (Projection repository) : Publish \nprojection -RabbitMQ <- (Projection bus) : Publish \nprojection -RabbitMQ <- (Projection bus) : Subscribe \nto projection -RabbitMQ .> (Projection bus) : Emit projection - -(Event bus) <---- (Projection repository) : Subscribe -(Event bus) ..> (Projection repository) : Emit event - -(Projection repository) --> Redis : Persist \nprojection -(Projection repository) <- Redis : Get \nprojection -(Projection repository) -> (Projection builder) : Build \nprojection - -(Projection builder) --> Projection : <> -@enduml \ No newline at end of file diff --git a/doc/schemas/Workflow.svg b/doc/schemas/Workflow.svg deleted file mode 100644 index 6d1ad76..0000000 --- a/doc/schemas/Workflow.svg +++ /dev/null @@ -1 +0,0 @@ -LegendQueriesProjectionsEventsUserQueryCommandEventProjectionPostgresqlRedisRabbitMQWeb socket adapterCommand handlerActionEvent handlerVersion builderEvent storeEvent streamEvent busReaction listenerProjection builderProjection repositoryProjection busControllerAcquire a lock,get the next event version,and then, build the event«create»«create»GetprojectionReturnsprojectionGetprojectionSendcommandSend notification(error or success)SendcommandSendnotificationExecute actionReturnsevent builderDispatchevent(send an event builder)«Create»PublisheventDispatchnew eventbuild next versionPublisheventPersisteventPublisheventSubscribeto eventEmit eventSubscribeEmit projectionPublishprojectionPublishprojectionSubscribeto projectionEmit projectionSubscribeEmit eventPersistprojectionGetprojectionBuildprojection«create projection» \ No newline at end of file