Project Structure Guide - Jipmaa/WE4B GitHub Wiki
Ce guide explique l'organisation et les conventions utilisées dans notre application web full-stack construite avec Angular (frontend) et Express.js (backend).
📁 Structure Complète du Projet
project-root/
├── client/ # Application frontend Angular
│ ├── public/ # Ressources statiques (favicon, images, etc.)
│ └── src/
│ └── app/ # Application Angular principale (alias: @/)
│ ├── core/ # Services singleton et fonctionnalités à l'échelle de l'application
│ │ ├── guards/ # Logique de protection des routes
│ │ │ └── auth.guard.ts
│ │ ├── interceptors/ # Intercepteurs de requêtes/réponses HTTP
│ │ │ └── auth.interceptor.ts
│ │ ├── models/ # Interfaces/types TypeScript partagés
│ │ │ ├── _shared.models.ts
│ │ │ ├── auth.models.ts
│ │ │ └── course-unit.models.ts
│ │ └── services/ # Services singleton à l'échelle de l'application
│ │ ├── auth.service.ts
│ │ ├── course-unit.service.ts
│ │ └── api.service.ts
│ ├── features/ # Modules spécifiques aux fonctionnalités
│ │ ├── authentication/ # Exemple : Fonctionnalité d'authentification
│ │ │ ├── components/ # Composants spécifiques à cette fonctionnalité
│ │ │ │ ├── login/
│ │ │ │ │ ├── login.component.ts
│ │ │ │ │ ├── login.component.html
│ │ │ │ │ └── login.component.spec.ts
│ │ │ │ └── register/
│ │ │ │ ├── register.component.ts
│ │ │ │ ├── register.component.html
│ │ │ │ └── register.component.spec.ts
│ │ │ └── authentication.routes.ts
│ │ └── course-management/ # Exemple : Fonctionnalité de gestion de cours
│ │ ├── components/ # Composants spécifiques à la fonctionnalité
│ │ │ ├── course-list/
│ │ │ ├── course-detail/
│ │ │ └── course-form/
│ │ ├── models/ # Modèles spécifiques à la fonctionnalité (optionnel)
│ │ │ └── course-management.models.ts
│ │ ├── services/ # Services spécifiques à la fonctionnalité (optionnel)
│ │ │ └── course-management.service.ts
│ │ └── course-management.routes.ts
│ └── shared/ # Composants et utilitaires réutilisables
│ ├── components/ # Composants d'interface utilisateur réutilisables
│ │ ├── layout/ # Composants de mise en page de l'application
│ │ │ ├── header/
│ │ │ ├── footer/
│ │ │ └── sidebar/
│ │ └── ui/ # Éléments d'interface utilisateur de base réutilisables
│ │ ├── button/
│ │ ├── modal/
│ │ ├── table/
│ │ └── form/
│ ├── directives/ # Directives Angular personnalisées
│ ├── pipes/ # Pipes Angular personnalisés
│ ├── types/ # Types TypeScript partagés
│ └── utils/ # Fonctions utilitaires et helpers
└── server/ # Application backend Express.js
├── src/
│ ├── middleware/ # Fonctions middleware Express
│ │ ├── auth-middleware.ts # Middleware d'authentification
│ │ ├── error-handler.ts # Gestion globale des erreurs
│ │ ├── not-found.ts # Gestionnaire d'erreur 404
│ │ ├── roles-middleware.ts # Contrôle d'accès basé sur les rôles
│ │ └── validate-request.ts # Middleware de validation des requêtes
│ ├── models/ # Modèles de base de données Mongoose
│ │ ├── course-unit.ts # Modèle de données d'unité de cours
│ │ ├── user.ts # Modèle de données utilisateur
│ │ └── enrollment.ts # Modèle de données d'inscription
│ ├── routes/ # Définitions des routes Express
│ │ ├── auth-routes.ts # Points de terminaison d'authentification
│ │ ├── course-unit-routes.ts # Points de terminaison CRUD d'unité de cours
│ │ ├── setup-routes.ts # Points de terminaison de configuration initiale
│ │ └── user-routes.ts # Points de terminaison de gestion des utilisateurs
│ ├── utils/ # Fonctions utilitaires et helpers
│ │ ├── app-error.ts # Classe d'erreur personnalisée
│ │ ├── async-handler.ts # Wrapper de gestion d'erreurs asynchrones
│ │ └── database.ts # Utilitaires de connexion à la base de données
│ └── index.ts # Point d'entrée du serveur
├── .env # Variables d'environnement (non dans le contrôle de version)
├── .env.example # Modèle de variables d'environnement
└── docker-compose.yml # Configuration Docker pour le développement
🎯 Conventions de Nommage
Tous noms de fichiers et de variables doivent être en anglais.
Nommage des Fichiers
- snake-case pour tous les fichiers :
auth-middleware.ts
,course-unit.ts
,user-routes.ts
- snake-case pour les composants Angular :
course-list
,user-profile
,login-form
- Suffixes descriptifs pour les fichiers Angular :
.service.ts
,.component.ts
,.guard.ts
,.routes.ts
Conventions de Code
- camelCase pour les variables et fonctions :
getUserById
,courseUnits
,isAuthenticated
- PascalCase pour les classes et interfaces :
CourseUnit
,AuthService
,UserModel
- UPPER_SNAKE_CASE pour les constantes :
API_BASE_URL
,MAX_FILE_SIZE
📂 Organisation des Dossiers Expliquée
Structure Client (Angular)
core/
- Fondation de l'Application
Contient les services singleton et les fonctionnalités à l'échelle de l'application qui ne doivent être importées qu'une seule fois :
- guards/ : Protègent les routes (authentification, autorisation)
- interceptors/ : Gèrent les requêtes/réponses HTTP globalement
- models/ : Interfaces TypeScript partagées utilisées dans toute l'application
- services/ : Services globaux (communication API, authentification)
features/
- Modules de Logique Métier
Chaque fonctionnalité obtient son propre dossier contenant tout ce qui est lié à cette fonctionnalité spécifique :
- components/ : Composants d'interface utilisateur spécifiques à cette fonctionnalité
- models/ : Types/interfaces utilisés uniquement dans cette fonctionnalité
- services/ : Services de logique métier spécifiques à cette fonctionnalité
- routes/ : Configuration des routes pour cette fonctionnalité
shared/
- Éléments Réutilisables
Composants et utilitaires qui peuvent être utilisés dans plusieurs fonctionnalités :
- components/layout/ : Composants de mise en page à l'échelle de l'application (en-tête, pied de page, navigation)
- components/ui/ : Composants d'interface utilisateur génériques (boutons, modales, formulaires)
- directives/ : Directives Angular personnalisées
- pipes/ : Pipes de transformation de données personnalisés
- types/ : Types TypeScript communs
- utils/ : Fonctions d'aide et utilitaires
Structure Serveur (Express)
middleware/
- Traitement des Requêtes
Fonctions qui traitent les requêtes avant qu'elles n'atteignent les gestionnaires de routes :
- auth-middleware.ts : Valide les jetons d'authentification des utilisateurs
- error-handler.ts : Gestion centralisée des erreurs et formatage des réponses
- roles-middleware.ts : Vérifie les permissions des utilisateurs pour les ressources protégées
- validate-request.ts : Valide les données des requêtes entrantes
models/
- Couche de Données
Schémas Mongoose qui définissent la structure de la base de données et les règles métier :
- course-unit.ts : Modèle de données d'unité de cours et validation
- user.ts : Modèle de compte utilisateur avec champs d'authentification
routes/
- Points de Terminaison API
Modules de routeur Express qui définissent les points de terminaison API :
- auth-routes.ts : Points de terminaison de connexion, déconnexion, inscription
- course-unit-routes.ts : Opérations CRUD pour les unités de cours
- setup-routes.ts : Points de terminaison de configuration initiale de l'application
utils/
- Fonctions d'Aide
Fonctions utilitaires et classes utilisées dans tout le serveur :
- app-error.ts : Classe d'erreur personnalisée pour une gestion cohérente des erreurs
- async-handler.ts : Wrapper pour les gestionnaires de routes asynchrones
🔧 Conventions Spéciales
Alias de Chemin Angular
- Utilisez
@/
comme alias poursrc/app/
dans les imports - Exemple :
import { AuthService } from '@/core/services/auth.service'
Framework CSS
- Tailwind CSS est utilisé au lieu de fichiers CSS spécifiques aux composants
- Aucun fichier
.css
dans les dossiers de composants (les styles sont appliqués via les classes Tailwind)
Configuration d'Environnement du Serveur
- Développement : Utilisez le fichier
.env
pour la configuration locale - Production : Variables d'environnement définies via la plateforme de déploiement
- Modèle :
.env.example
montre les variables d'environnement requises
📋 Meilleures Pratiques
Organisation des Fichiers
- Gardez les fichiers liés ensemble dans les dossiers de fonctionnalités
- Utilisez des noms de fichiers descriptifs qui indiquent leur objectif
- Séparez les préoccupations : modèles, services, composants dans leurs dossiers respectifs
Organisation des Imports
- Utilisez des imports absolus avec l'alias
@/
pour une meilleure lisibilité - Gardez les imports organisés et supprimez ceux qui ne sont pas utilisés
Structure des Composants
- Composants petits et ciblés qui font une chose bien
- Utilisez les dossiers de fonctionnalités pour regrouper les composants liés
- Les composants partagés vont dans
shared/components/