Application Principale
Vue d'ensemble
L'application principale constitue le cœur du système, orchestrant le fonctionnement global de l'application et établissant les bases pour tous les autres composants. Elle comprend la configuration du serveur, l'initialisation de l'application, le routage, et l'intégration avec la base de données MongoDB. Cette section couvre les aspects fondamentaux qui permettent le fonctionnement de toutes les fonctionnalités du jeu.
Composants principaux
AppComponent
Le composant AppComponent
représente la racine de l'application Angular. Il affiche un écran de chargement lors des transitions de pages et gère les animations entre les routes.
Propriétés
Propriété | Type | Description |
---|---|---|
isLoading |
boolean |
Indique si l'écran de chargement doit être affiché |
Méthodes
constructor(private router: Router)
Description : Initialise le composant et configure les écouteurs d'événements pour les transitions de navigation.
Paramètres : router
- Service de routage Angular.
prepareRoute(outlet: RouterOutlet)
Description : Prépare les données d'animation pour les transitions entre routes.
Paramètres : outlet
- Référence à l'outlet du routeur.
Retour : Données d'animation pour la route active.
onActivate()
Description : Ramène le défilement en haut de la page lors du changement de route.
Retour : void
Éléments HTML importants
- Écran de chargement : Affiché lors des transitions entre les pages
- Conteneur principal : Contient l'outlet du routeur avec les animations
- Outlet du routeur : Point d'insertion pour les composants des différentes routes
Application (Backend)
La classe Application
est responsable de l'initialisation du serveur Express et de la configuration de l'API REST.
Propriétés
Propriété | Type | Description |
---|---|---|
app |
express.Application |
Instance de l'application Express |
gameManagerController |
GameManagerController |
Contrôleur de gestion des jeux |
mongoClient |
MongoClient |
Client de connexion à MongoDB |
Méthodes
constructor(gameManagerController: GameManagerController)
Description : Initialise l'application avec le contrôleur de gestion des jeux.
Paramètres : gameManagerController
- Contrôleur pour les opérations sur les jeux.
bindRoutes()
Description : Configure les routes de l'API.
Retour : void
Détails : Attache le routeur du contrôleur à la route '/game-manager'.
private config()
Description : Configure les middlewares Express.
Retour : void
Détails : Configure les limites de taille pour les requêtes JSON, CORS, etc.
private async initializeDatabase()
Description : Initialise la connexion à la base de données MongoDB.
Retour : Promise<void>
Détails : Établit la connexion à la base de données via MongoClient.
Server
La classe Server
est responsable de la création et du démarrage du serveur HTTP et du serveur Socket.IO.
Propriétés
Propriété | Type | Description |
---|---|---|
io |
SocketIOServer |
Instance du serveur Socket.IO |
server |
http.Server |
Instance du serveur HTTP |
Méthodes
constructor(private readonly application: Application)
Description : Initialise le serveur avec l'instance de l'application.
Paramètres : application
- Instance de l'application Express.
init()
Description : Initialise et démarre le serveur HTTP et Socket.IO.
Retour : void
Détails : Configure les ports et les gestionnaires d'événements.
getIO()
Description : Récupère l'instance du serveur Socket.IO.
Retour : SocketIOServer
- Instance du serveur Socket.IO.
private onError(error: NodeJS.ErrnoException)
Description : Gère les erreurs lors du démarrage du serveur.
Paramètres : error
- Erreur rencontrée.
Retour : void
Détails : Gère différents types d'erreurs (EACCES, EADDRINUSE, etc.).
private onListening()
Description : Appelé lorsque le serveur commence à écouter.
Retour : void
Détails : Affiche le port d'écoute.
GameManagerController
Le contrôleur GameManagerController
gère toutes les opérations CRUD liées aux jeux via l'API REST.
Propriétés
Propriété | Type | Description |
---|---|---|
gameVerifier |
GameVerifierService |
Service de vérification des jeux |
databaseService |
DatabaseService |
Service d'accès à la base de données |
router |
Router |
Routeur Express pour définir les endpoints |
Méthodes
constructor(gameVerifier: GameVerifierService, databaseService: DatabaseService)
Description : Initialise le contrôleur avec les services nécessaires.
Paramètres :
gameVerifier
- Service de vérification des jeuxdatabaseService
- Service d'accès à la base de données
configureRoutes()
Description : Configure les routes de l'API pour la gestion des jeux.
Retour : void
Détails : Définit les gestionnaires pour les différentes routes (GET, PUT, POST, DELETE, PATCH).
Configuration et initialisation
Main (Angular)
Le fichier main.ts
configure et initialise l'application Angular avec les routes et les fournisseurs nécessaires.
Routes
Route | Composant | Description |
---|---|---|
/ (défaut) |
MainPageComponent |
Page d'accueil |
/${AppRoutes.Home} |
MainPageComponent |
Page d'accueil |
/${AppRoutes.Games} |
GameCreationPageComponent |
Page de création de partie |
/${AppRoutes.Edition} |
EditionPageComponent |
Page d'édition de jeu |
/${AppRoutes.Admin} |
AdminPageComponent |
Page d'administration des jeux |
/${AppRoutes.CharacterCreation} |
CharacterCreationPageComponent |
Page de création de personnage |
/${AppRoutes.WaitingRoom} |
WaitingRoomPageComponent |
Salle d'attente |
/${AppRoutes.GameView} |
GameViewPageComponent |
Vue du jeu en cours |
/${AppRoutes.Stats} |
StatsPageComponent |
Page des statistiques |
** (toute autre route) |
MainPageComponent |
Redirection vers la page d'accueil |
Providers
provideHttpClient()
: Fournit le client HTTP AngularprovideRouter()
: Configure le routeur Angular avec hashLocation et préchargementprovideAnimations()
: Active les animations AngularutilityServicesProvider
: Fournit les services utilitaires
Main (Backend)
Le fichier index.ts
est le point d'entrée du serveur, initialisant l'application et les services.
Processus d'initialisation
- Importation de 'reflect-metadata' et 'module-alias/register'
- Récupération de l'instance du serveur via l'injection de dépendances avec TypeDI
- Initialisation du serveur
- Récupération et initialisation du SocketService
Services essentiels
DatabaseService
Service responsable de la communication avec la base de données MongoDB.
Propriétés
Propriété | Type | Description |
---|---|---|
dbClient |
MongoClient |
Client MongoDB |
dbName |
string |
Nom de la base de données |
gamesCollection |
Collection |
Collection des jeux |
Méthodes
constructor(dbClient: MongoClient, dbName: string)
Description : Initialise le service avec le client et le nom de la base de données.
Paramètres :
dbClient
- Client MongoDBdbName
- Nom de la base de données
async insertGame(game: Game)
Description : Insère un nouveau jeu dans la base de données.
Paramètres : game
- Jeu à insérer.
Retour : Promise<void>
async updateGame(game: Game, id: string)
Description : Met à jour un jeu existant.
Paramètres :
game
- Jeu mis à jourid
- Identifiant du jeu
Retour : Promise<void>
Détails : Exclut le champ _id du jeu avant la mise à jour.
async isGameNameInDB(name: string)
Description : Vérifie si un jeu avec le nom spécifié existe dans la base de données.
Paramètres : name
- Nom du jeu.
Retour : Promise<boolean>
- Vrai si le jeu existe.
async isGameIdInDB(id: string)
Description : Vérifie si un jeu avec l'identifiant spécifié existe dans la base de données.
Paramètres : id
- Identifiant du jeu.
Retour : Promise<boolean>
- Vrai si le jeu existe.
async getGame(name: string)
Description : Récupère un jeu par son nom.
Paramètres : name
- Nom du jeu.
Retour : Promise<Game>
- Le jeu correspondant.
async getGameById(id: string)
Description : Récupère un jeu par son identifiant.
Paramètres : id
- Identifiant du jeu.
Retour : Promise<Game>
- Le jeu correspondant.
async getGamesList()
Description : Récupère tous les jeux.
Retour : Promise<Game[]>
- Liste de tous les jeux.
async deleteGame(name: string)
Description : Supprime un jeu par son nom.
Paramètres : name
- Nom du jeu.
Retour : Promise<void>
async changeVisibility(name: string)
Description : Inverse la visibilité d'un jeu.
Paramètres : name
- Nom du jeu.
Retour : Promise<void>
Détails : Récupère l'état actuel de visibilité et l'inverse.
GameVerifierService
Service responsable de la vérification de la validité des jeux avant sauvegarde.
Propriétés
Propriété | Type | Description |
---|---|---|
databaseService |
DatabaseService |
Service d'accès à la base de données |
Méthodes
constructor(databaseService: DatabaseService)
Description : Initialise le service avec le service de base de données.
Paramètres : databaseService
- Service de base de données.
async isGameValid(game: Game, id: string)
Description : Vérifie si un jeu est valide.
Paramètres :
game
- Jeu à vérifierid
- Identifiant du jeu
Retour : Promise<string[]>
- Liste des raisons d'invalidité.
Détails : Vérifie plusieurs aspects comme le nom, la description, les portes, etc.
La classe contient également de nombreuses méthodes de vérification spécifiques:
isNamePresent
: Vérifie si le nom est présentisDescPresent
: Vérifie si la description est présenteisDoorValid
: Vérifie si une porte est validevalidateAllDoors
: Vérifie toutes les portesisWall
: Vérifie si une tuile est un murisHalfFloor
: Vérifie si au moins la moitié des tuiles sont du solisNameValid
: Vérifie si le nom est disponibleisStartpointsSet
: Vérifie si les points de départ sont définisisTilesAccessible
: Vérifie si toutes les tuiles sont accessiblesisFlagPresent
: Vérifie si le drapeau est présent pour le mode CTFhasRequiredItemCount
: Vérifie si le nombre d'items requis est présent
SocketService
Service gérant la communication en temps réel via Socket.IO.
Propriétés
Propriété | Type | Description |
---|---|---|
socket |
Socket |
Instance du socket |
currentGameSubject |
BehaviorSubject<OnGoingGame> |
Subject contenant le jeu en cours |
currentPlayerSubject |
BehaviorSubject<Player> |
Subject contenant le joueur courant |
Méthodes
constructor(server: Server, onGoingGameService: OnGoingGameService, waitingSocketService: WaitingSocketService, joinRoomService: JoinGameService, timerService: TimerSocketService, combatService: CombatSocketService, chatService: ChatService)
Description : Initialise le service avec les dépendances nécessaires.
sendToRoom(nip: string, dir: string, data?: unknown)
Description : Envoie des données à une salle spécifique.
Paramètres :
nip
- Code de la salledir
- Événement à émettredata
- Données à envoyer (optionnel)
Retour : void
getIO()
Description : Récupère l'instance du serveur Socket.IO.
Retour : SocketIOServer
- Instance du serveur Socket.IO.
private init()
Description : Initialise les écouteurs d'événements Socket.IO.
Retour : void
Détails : Configure l'événement de connexion.
private activateNewSocket(socket: Socket)
Description : Configure un nouveau socket avec tous les gestionnaires.
Paramètres : socket
- Socket à configurer.
Retour : void
Détails : Active les différents gestionnaires pour les différentes fonctionnalités.
Fournisseurs de services
ServiceProviders
La fonction utilityServicesProvider
crée un fournisseur pour les services utilitaires utilisés dans l'application.
Services fournis
Service | Description |
---|---|
GameSocketHandlerService |
Service de gestion des événements socket pour le jeu |
GameUtilityService |
Service utilitaire pour le jeu |
Communication avec le serveur
API REST
Le serveur expose une API REST via le GameManagerController
:
Méthode | Route | Description |
---|---|---|
POST | /game-manager/verify |
Vérifie la validité d'un jeu |
PUT | /game-manager/ |
Crée ou met à jour un jeu |
GET | /game-manager/ |
Récupère tous les jeux |
GET | /game-manager/:name |
Récupère un jeu par son nom |
DELETE | /game-manager/:name |
Supprime un jeu |
GET | /game-manager/visibility/:name |
Vérifie la visibilité d'un jeu |
PATCH | /game-manager/visibility/:name |
Change la visibilité d'un jeu |
WebSockets (Socket.IO)
Le serveur utilise Socket.IO pour la communication en temps réel, gérée par plusieurs services:
SocketService
: Service principal de gestion des socketsWaitingSocketService
: Gestion des sockets pour la salle d'attenteJoinGameService
: Gestion des sockets pour rejoindre une partieTimerSocketService
: Gestion des sockets pour les minuteursCombatSocketService
: Gestion des sockets pour les combatsChatService
: Gestion des sockets pour le chat
Animations et transitions
L'application utilise le système d'animations d'Angular pour les transitions entre les routes via l'animation slideInAnimation
configurée dans AppComponent
.
Types d'animations
- Transition entre routes : Effet de glissement lors du changement de page
- Animation de chargement : Affichage d'un loader pendant les transitions
Structuration et organisation du code
Structure modulaire
L'application est organisée en modules logiques:
- Pages : Composants de niveau supérieur pour chaque route principale
- Composants : Éléments réutilisables utilisés dans les pages
- Services : Logique métier et communication avec le serveur
- Classes : Modèles de données et entités du domaine
- Interfaces : Définitions de types partagés
- Constantes : Valeurs partagées dans toute l'application
Dépendances externes
L'application utilise plusieurs bibliothèques externes:
- Angular : Framework frontal
- Express : Framework serveur
- Socket.IO : Communication en temps réel
- MongoDB : Base de données
- TypeDI : Injection de dépendances côté serveur
- http-status-codes : Codes de statut HTTP
- module-alias et reflect-metadata : Utilitaires pour le serveur
Sécurité et gestion des erreurs
Gestion des erreurs
Le serveur gère différentes erreurs potentielles:
- Erreurs de démarrage du serveur : EACCES (permissions), EADDRINUSE (port déjà utilisé)
- Erreurs de base de données : Non trouvé, conflit, etc.
- Erreurs de validation : Vérification de la validité des jeux
Codes de statut HTTP
Les réponses de l'API utilisent les codes de statut HTTP appropriés:
- 200 OK : Requête réussie
- 201 Created : Ressource créée
- 204 No Content : Suppression réussie
- 400 Bad Request : Requête invalide
- 404 Not Found : Ressource non trouvée
Environnement de développement
Variables d'environnement
L'application utilise des variables d'environnement pour configurer différents aspects:
- serverUrl : URL du serveur, différente selon l'environnement (développement ou production)
- PORT : Port du serveur (par défaut: 3000)
- MONGO_URI : URI de connexion à MongoDB
Modes de fonctionnement
- Développement : Mode de développement avec hot reloading et débogage
- Production : Mode optimisé pour la production