Infrastructure et Configuration
Cette section détaille les composants fondamentaux qui établissent l'infrastructure du serveur de jeu. Elle comprend trois fichiers principaux qui gèrent la configuration du serveur HTTP, l'initialisation de l'application Express, et l'interface avec la base de données MongoDB.
Server (server.ts)
La classe Server
est le point d'entrée principal qui initialise le serveur HTTP et configure Socket.IO pour les communications en temps réel.
Méthodes
constructor(private readonly application: Application)
Description: Constructeur qui injecte l'instance de l'application Express.
Paramètres: application
- Instance de la classe Application qui encapsule l'application Express.
Importance: Élévée - Point d'injection principal pour l'application.
init(): void
Description: Initialise le serveur HTTP et configure Socket.IO.
Retour: Aucun.
Importance: Élevée - Configure le serveur HTTP, définit le port d'écoute, et initialise Socket.IO avec CORS.
Détails: Cette méthode est critique car elle:
1. Configure le port d'écoute du serveur
2. Crée un serveur HTTP à partir de l'application Express
3. Initialise Socket.IO avec la configuration CORS
4. Met en place un gestionnaire de connexion basique
5. Démarre l'écoute sur le port configuré
getIO(): SocketIOServer
Description: Renvoie l'instance de Socket.IO pour permettre l'accès externe.
Retour: L'instance de SocketIOServer.
Importance: Élevée - Point d'accès principal à Socket.IO pour les autres services.
private static normalizePort(val: number | string): number | string | boolean
Description: Normalise la valeur du port d'écoute.
Paramètres: val
- Valeur du port, soit une chaîne, soit un nombre.
Retour: Port normalisé (nombre, chaîne, ou booléen).
Importance: ? - Utilitaire interne de normalisation.
private onError(error: NodeJS.ErrnoException): void
Description: Gère les erreurs liées au démarrage du serveur.
Paramètres: error
- L'erreur rencontrée.
Importance: Élevée - Gestion des erreurs courantes comme EACCES (permissions) et EADDRINUSE (port déjà utilisé).
private onListening(): void
Description: Callback exécuté lorsque le serveur commence à écouter.
Application (app.ts)
La classe Application
configure l'application Express avec les middlewares nécessaires et établit la connexion à MongoDB.
Méthodes
constructor(gameManagerController: GameManagerController)
Description: Initialise l'application Express et configure les services nécessaires.
Paramètres: gameManagerController
- Contrôleur pour gérer les routes liées aux jeux.
Importance: Élevée - Point d'entrée pour la configuration de l'application web.
Détails: Le constructeur:
1. Initialise la connexion à la base de données
2. Stocke une référence au contrôleur des jeux
3. Crée une nouvelle instance d'Express
4. Configure les middlewares via config()
5. Lie les routes de l'API via bindRoutes()
bindRoutes(): void
Description: Attache le contrôleur des jeux aux routes appropriées.
Retour: Aucun.
Importance: Élevée - Configure le routage des API.
Détails: Assigne le routeur du gameManagerController
au chemin '/game-manager', exposant ainsi les endpoints de gestion des jeux.
private config(): void
Description: Configure les middlewares Express essentiels.
Importance: Élevée - Prépare l'application à traiter les requêtes HTTP.
Détails: Configure:
1. express.json()
pour analyser les corps de requête JSON (avec limite de 5MB)
2. express.urlencoded()
pour analyser les corps de requête encodés en URL
3. cookieParser()
pour analyser les cookies
4. cors()
pour permettre les requêtes cross-origin
private async initializeDatabase(): Promise<void>
Description: Établit la connexion à la base de données MongoDB.
Importance: Élevée - Assure la persistance des données.
Détails: Récupère l'instance MongoClient depuis le conteneur TypeDI et établit la connexion.
DatabaseService (database.service.ts)
La classe DatabaseService
fournit une interface entre l'application et la base de données MongoDB.
Méthodes
constructor(dbClient: MongoClient, dbName: string)
Description: Initialise le service avec le client MongoDB et le nom de la base de données.
Paramètres:
- dbClient
- Client MongoDB connecté
- dbName
- Nom de la base de données
Importance: Élevée - Établit la connexion à la collection "Games".
async insertGame(game: Game): Promise<void>
Description: Insère un nouveau jeu dans la base de données.
Paramètres: game
- Objet de type Game à insérer.
Importance: Élevée - Méthode principale pour sauvegarder des jeux.
async updateGame(game: Game, id: string): Promise<void>
Description: Met à jour un jeu existant dans la base de données.
Paramètres:
- game
- Jeu à mettre à jour
- id
- Identifiant MongoDB du jeu
Importance: Élevée - Utilisée lors de l'édition des jeux.
Détails: La méthode retire le champ _id
avant la mise à jour pour éviter les erreurs MongoDB.
async isGameNameInDB(name: string): Promise<boolean>
Description: Vérifie si un jeu avec le nom spécifié existe déjà dans la base de données.
Paramètres: name
- Nom du jeu à vérifier.
Retour: true
si le jeu existe, false
sinon.
Importance: Élevée - Utilisée pour éviter les duplications.
async isGameIdInDB(id: string): Promise<boolean>
Description: Vérifie si un jeu avec l'ID spécifié existe dans la base de données.
Paramètres: id
- ID MongoDB du jeu.
Retour: true
si le jeu existe, false
sinon.
Importance: Élevée - Utilisée pour vérifier l'existence avant modification.
async getGame(name: string): Promise<Game>
Description: Récupère un jeu par son nom.
Paramètres: name
- Nom du jeu à récupérer.
Retour: L'objet Game correspondant.
Importance: Élevée - Accès principal aux jeux par nom.
async getGameById(id: string): Promise<Game>
Description: Récupère un jeu par son ID MongoDB.
Paramètres: id
- ID MongoDB du jeu.
Retour: L'objet Game correspondant.
Importance: Élevée - Accès principal aux jeux par ID.
async getGamesList(): Promise<Game[]>
Description: Récupère tous les jeux de la base de données.
Retour: Un tableau de tous les jeux.
Importance: Élevée - Utilisée pour afficher la liste des jeux disponibles.
async deleteGame(name: string): Promise<void>
Description: Supprime un jeu par son nom.
Paramètres: name
- Nom du jeu à supprimer.
Importance: Élevée - Utilisée pour la suppression des jeux.
async changeVisibility(name: string): Promise<void>
Description: Bascule la visibilité d'un jeu (visible/caché).
Paramètres: name
- Nom du jeu à modifier.
Importance: Élévée - Utilisée pour gérer la visibilité des jeux dans la liste.
Points d'attention
- Le service
DatabaseService
traite uniquement les jeux (plateaux) mais pas les parties en cours, qui sont gérées en mémoire. - La classe
Server
expose l'instance Socket.IO viagetIO()
, qui est utilisée par les autres services pour communiquer avec les clients. - La séparation entre la configuration du serveur HTTP et la gestion des WebSockets permet une meilleure modularité.