# boorry/dominos architecture

> Architecture diagram of the GitHub repository boorry/dominos, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/boorry/dominos
- Repository: https://github.com/boorry/dominos

## Overview

Dominos is a Spring Boot multiplayer domino game with REST account, matchmaking, game, tournament, and statistics features, plus WebSocket game notifications. A typical flow is player registration, joining a queue, automatic creation of a game for three players, then turn-by-turn play through the game engine. Tournaments can also create games for bracket matches. The README gives no detail; the map combines the tree with sampled controller and service excerpts, so links for unsampled controller or feature internals are omitted.

Main entry points: [`dominos/src/main/java/com/dominos/application/partie/PartieApplicationService.java`](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/partie/PartieApplicationService.java) (Game application service), [`dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurRepository.java`](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurRepository.java) (User repository), [`dominos/src/main/java/com/dominos/application/tournoi/TournoiService.java`](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/tournoi/TournoiService.java) (Tournament service), [`dominos/src/main/java/com/dominos/api/controller/UtilisateurController.java`](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/UtilisateurController.java) (User controller)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["REST API"]
  node_user_api["User controller"]
  node_match_api["Matchmaking controller"]
  node_game_api["Game controller"]
  node_tournament_api["Tournament controller"]
end

subgraph group_accounts["Accounts and stats"]
  node_user_service["User service"]
  node_password["Password hashing"]
  node_user_repo["User repository"]
  node_user_storage["User persistence"]
  node_stats_service["Statistics service<br/>[StatsService.java]"]
  node_stats_repo["Statistics repository"]
  node_stats_storage["Statistics queries"]
end

subgraph group_play["Matchmaking and play"]
  node_match_service["Matchmaking service"]
  node_match_repo["Queue repository"]
  node_match_memory["In-memory queue"]
  node_game_service["Game application service"]
  node_game_store["Game persistence"]
end

subgraph group_tournaments["Tournaments"]
  node_tournament_service["Tournament service"]
  node_tournament_repo["Tournament repository"]
  node_tournament_memory["Tournament storage"]
end

subgraph group_runtime["Game domain and delivery"]
  node_game_domain["Game state<br/>[Partie.java]"]
  node_engine["Move engine<br/>[MoteurJeu.java]"]
  node_notification["Game notifications"]
end

node_player(("Player"))
node_websocket(("WebSocket clients"))

node_player -->|"sends account requests"| node_user_api
node_player -->|"joins queue"| node_match_api
node_player -->|"plays turns"| node_game_api
node_player -->|"enters tournaments"| node_tournament_api
node_user_api -->|"delegates"| node_user_service
node_user_api -->|"requests stats"| node_stats_service
node_user_service -->|"reads and saves"| node_user_repo
node_user_service -->|"hashes and verifies"| node_password
node_user_repo -->|"implemented by"| node_user_storage
node_stats_service -->|"checks player"| node_user_repo
node_stats_service -->|"calculates stats"| node_stats_repo
node_stats_repo -->|"implemented by"| node_stats_storage
node_match_api -->|"delegates"| node_match_service
node_match_api -->|"creates matched game"| node_game_service
node_match_service -->|"loads players"| node_user_repo
node_match_service -->|"manages queue"| node_match_repo
node_match_repo -->|"implemented by"| node_match_memory
node_game_api -->|"handles game requests"| node_game_service
node_game_service -->|"runs moves"| node_engine
node_game_service -->|"saves game"| node_game_store
node_game_service -->|"dispatches events"| node_notification
node_engine -->|"updates state"| node_game_domain
node_notification -->|"publishes events"| node_websocket
node_tournament_api -->|"delegates"| node_tournament_service
node_tournament_service -->|"loads and saves"| node_tournament_repo
node_tournament_repo -->|"implemented by"| node_tournament_memory
node_tournament_service -->|"loads entrants"| node_user_repo
node_tournament_service -->|"creates match games"| node_game_service

click node_user_api "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/UtilisateurController.java"
click node_match_api "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/MatchmakingController.java"
click node_game_api "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/PartieController.java"
click node_tournament_api "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/TournoiController.java"
click node_user_service "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurService.java"
click node_password "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/domain/utilisateur/MotDePasseService.java"
click node_user_repo "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurRepository.java"
click node_user_storage "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/utilisateur/UtilisateurRepositoryJpa.java"
click node_stats_service "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/stats/StatsService.java"
click node_stats_repo "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/stats/StatsRepository.java"
click node_stats_storage "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/stats/StatsRepositoryJpa.java"
click node_match_service "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/matchmaking/MatchmakingService.java"
click node_match_repo "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/matchmaking/MatchmakingRepository.java"
click node_match_memory "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/matchmaking/MatchmakingRepositoryMemoire.java"
click node_game_service "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/partie/PartieApplicationService.java"
click node_game_store "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/partie/PartieJpaRepository.java"
click node_tournament_service "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/tournoi/TournoiService.java"
click node_tournament_repo "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/tournoi/TournoiRepository.java"
click node_tournament_memory "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/tournoi/TournoiRepositoryMemoire.java"
click node_game_domain "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/domain/Partie.java"
click node_engine "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/moteur/MoteurJeu.java"
click node_notification "https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/partie/NotificationService.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_user_api,node_match_api,node_game_api,node_tournament_api,node_websocket toneBlue
class node_user_service,node_password,node_user_repo,node_user_storage,node_stats_service,node_stats_repo,node_stats_storage toneAmber
class node_match_service,node_match_repo,node_match_memory,node_game_service,node_game_store toneMint
class node_tournament_service,node_tournament_repo,node_tournament_memory toneRose
class node_game_domain,node_engine,node_notification,node_player toneIndigo
```

## Components

### REST API

- [User controller](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/UtilisateurController.java): `dominos/src/main/java/com/dominos/api/controller/UtilisateurController.java`
- [Matchmaking controller](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/MatchmakingController.java): `dominos/src/main/java/com/dominos/api/controller/MatchmakingController.java`
- [Game controller](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/PartieController.java): `dominos/src/main/java/com/dominos/api/controller/PartieController.java`
- [Tournament controller](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/api/controller/TournoiController.java): `dominos/src/main/java/com/dominos/api/controller/TournoiController.java`

### Accounts and stats

- [User service](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurService.java): `dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurService.java`
- [Password hashing](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/domain/utilisateur/MotDePasseService.java): `dominos/src/main/java/com/dominos/domain/utilisateur/MotDePasseService.java`
- [User repository](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurRepository.java): `dominos/src/main/java/com/dominos/application/utilisateur/UtilisateurRepository.java`
- [User persistence](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/utilisateur/UtilisateurRepositoryJpa.java): `dominos/src/main/java/com/dominos/infrastructure/utilisateur/UtilisateurRepositoryJpa.java`
- [Statistics service](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/stats/StatsService.java): `dominos/src/main/java/com/dominos/application/stats/StatsService.java`
- [Statistics repository](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/stats/StatsRepository.java): `dominos/src/main/java/com/dominos/application/stats/StatsRepository.java`
- [Statistics queries](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/stats/StatsRepositoryJpa.java): `dominos/src/main/java/com/dominos/infrastructure/stats/StatsRepositoryJpa.java`

### Matchmaking and play

- [Matchmaking service](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/matchmaking/MatchmakingService.java): `dominos/src/main/java/com/dominos/application/matchmaking/MatchmakingService.java`
- [Queue repository](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/matchmaking/MatchmakingRepository.java): `dominos/src/main/java/com/dominos/application/matchmaking/MatchmakingRepository.java`
- [In-memory queue](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/matchmaking/MatchmakingRepositoryMemoire.java): `dominos/src/main/java/com/dominos/infrastructure/matchmaking/MatchmakingRepositoryMemoire.java`
- [Game application service](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/partie/PartieApplicationService.java): `dominos/src/main/java/com/dominos/application/partie/PartieApplicationService.java`
- [Game persistence](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/partie/PartieJpaRepository.java): `dominos/src/main/java/com/dominos/infrastructure/partie/PartieJpaRepository.java`

### Tournaments

- [Tournament service](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/tournoi/TournoiService.java): `dominos/src/main/java/com/dominos/application/tournoi/TournoiService.java`
- [Tournament repository](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/tournoi/TournoiRepository.java): `dominos/src/main/java/com/dominos/application/tournoi/TournoiRepository.java`
- [Tournament storage](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/infrastructure/tournoi/TournoiRepositoryMemoire.java): `dominos/src/main/java/com/dominos/infrastructure/tournoi/TournoiRepositoryMemoire.java`

### Game domain and delivery

- [Game state](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/domain/Partie.java): `dominos/src/main/java/com/dominos/domain/Partie.java`
- [Move engine](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/moteur/MoteurJeu.java): `dominos/src/main/java/com/dominos/moteur/MoteurJeu.java`
- [Game notifications](https://github.com/boorry/dominos/blob/main/dominos/src/main/java/com/dominos/application/partie/NotificationService.java): `dominos/src/main/java/com/dominos/application/partie/NotificationService.java`

### Other components

- **Player**
- **WebSocket clients**

## Connections

- Player → User controller: sends account requests
- Player → Matchmaking controller: joins queue
- Player → Game controller: plays turns
- Player → Tournament controller: enters tournaments
- User controller → User service: delegates
- User controller → Statistics service: requests stats
- User service → User repository: reads and saves
- User service → Password hashing: hashes and verifies
- User repository → User persistence: implemented by
- Statistics service → User repository: checks player
- Statistics service → Statistics repository: calculates stats
- Statistics repository → Statistics queries: implemented by
- Matchmaking controller → Matchmaking service: delegates
- Matchmaking controller → Game application service: creates matched game
- Matchmaking service → User repository: loads players
- Matchmaking service → Queue repository: manages queue
- Queue repository → In-memory queue: implemented by
- Game controller → Game application service: handles game requests
- Game application service → Move engine: runs moves
- Game application service → Game persistence: saves game
- Game application service → Game notifications: dispatches events
- Move engine → Game state: updates state
- Game notifications → WebSocket clients: publishes events
- Tournament controller → Tournament service: delegates
- Tournament service → Tournament repository: loads and saves
- Tournament repository → Tournament storage: implemented by
- Tournament service → User repository: loads entrants
- Tournament service → Game application service: creates match games
