API REST backend développée avec Spring Boot pour la gestion d'une plateforme e-commerce. Cette API permet de gérer les utilisateurs, les produits, les commandes, les paiements (simulés) et les livraisons.
Le système permet de gérer la vente de produits en ligne avec les fonctionnalités suivantes :
- Consultation du catalogue de produits
- Gestion des utilisateurs et des rôles
- Gestion des commandes et des paiements (simulés)
- Gestion des livraisons
- Administration de la plateforme
Le projet adopte une architecture orientée services (API REST) organisée par domaine/acteur avec le principe de single responsibility, permettant une intégration avec plusieurs clients (Web, Mobile, etc.) et garantissant une meilleure maintenabilité et testabilité.
- Java 21
- Spring Boot 3.5.9
- Spring Data JPA / Hibernate
- Spring Security (JWT)
- PostgreSQL
- Liquibase (migrations de base de données)
- MapStruct (mapping d'objets)
- Lombok
- SpringDoc OpenAPI (documentation API)
- Testcontainers (tests d'intégration avec PostgreSQL)
- Maven
Ce projet met l'accent sur la qualité du code et les bonnes pratiques de développement :
Le projet suit une approche TDD (Test-Driven Development) : les tests sont écrits avant ou en parallèle du code de production, garantissant une couverture de code élevée et une meilleure conception des fonctionnalités.
Les tests d'intégration utilisent Testcontainers pour créer des environnements de test isolés et réalistes :
- PostgreSQL en conteneur Docker : Chaque test d'intégration s'exécute avec une base de données PostgreSQL réelle dans un conteneur Docker
- Tests end-to-end : Les tests couvrent l'ensemble de la stack (Controller → Service → Repository → Base de données)
- Isolation complète : Chaque test dispose de son propre environnement, garantissant la reproductibilité et l'indépendance des tests
- Tests d'API REST : Utilisation de MockMvc pour tester les endpoints HTTP
- Tests unitaires : Validation de la logique métier isolée
- Tests d'intégration : Validation du comportement end-to-end avec base de données réelle
- Tests de sécurité : Validation de l'authentification JWT et de l'autorisation par rôles
- Couverture de code : Objectif de maintenir une couverture élevée pour garantir la fiabilité
Cette approche rigoureuse garantit la fiabilité, la maintenabilité et la qualité du code produit.
- Java 21 ou supérieur
- Maven 3.6+
- PostgreSQL 12+
- Git
git clone <url-du-repository>
cd e-com-springCréer une base de données PostgreSQL :
CREATE DATABASE e_com_spring;Modifier le fichier src/main/resources/application.yml selon votre environnement :
spring:
datasource:
url: jdbc:postgresql://localhost:5432/e_com_spring
username: votre_utilisateur
password: votre_mot_de_passe./mvnw spring-boot:runOu avec Maven installé :
mvn spring-boot:runL'application sera disponible sur http://localhost:8080
Une fois l'application démarrée, la documentation Swagger/OpenAPI est accessible via :
http://localhost:8080/swagger-ui.html
Le système gère trois types d'utilisateurs :
- CLIENT : Consulte les produits, gère son panier, passe des commandes
- ADMIN : Gère le système (produits, commandes, utilisateurs)
- LIVREUR : Gère l'état des livraisons
Le système utilise JWT (JSON Web Token) pour l'authentification :
- Inscription des utilisateurs
- Connexion avec email et mot de passe
- Génération d'un token JWT après authentification
- Gestion des rôles (CLIENT, ADMIN, LIVREUR)
- Protection des endpoints par JWT
Les fonctionnalités sont organisées par domaine (acteur) pour respecter le principe de single responsibility.
- Inscription des utilisateurs
- Connexion avec email et mot de passe
- Génération de token JWT
- Gestion des rôles (CLIENT, ADMIN, LIVREUR)
- Catalogue : Consultation du catalogue de produits
- Panier : Ajout, modification de quantité, suppression de produits
- Commandes : Validation de commandes, calcul automatique du montant total, consultation de l'historique
- Paiement :
⚠️ Simulation de paiement (service externe non intégré), enregistrement du statut
- Produits : CRUD complet sur les produits
- Catégories : Gestion des catégories de produits
- Utilisateurs : Consultation de la liste, activation/désactivation
- Livraisons : Attribution d'une commande à un livreur
- Livraisons : Mise à jour du statut de livraison
- L'API doit répondre en moins de 2 secondes pour 95% des requêtes
- Mots de passe chiffrés (BCrypt)
- Protection des endpoints par JWT
- Vérification des rôles à chaque requête
- Conformité aux standards OWASP
- Le système doit être disponible 99% du temps
- Architecture supportant la montée en charge horizontale
- Architecture claire organisée par domaine (single responsibility)
- Code respectant les bonnes pratiques (SOLID)
- Séparation des responsabilités par acteur métier
Le projet adopte une architecture orientée single responsibility et organisée par domaine (acteur). Chaque domaine encapsule ses propres responsabilités, garantissant une séparation claire des préoccupations et une meilleure maintenabilité.
- Single Responsibility Principle (SRP) : Chaque service a une responsabilité unique et bien définie
- Organisation par domaine/acteur : Le code est structuré selon les acteurs du système (Client, Admin, Livreur)
- Séparation des couches : Controllers, Services, Repositories, DTOs et Mappers sont clairement séparés
- Interfaces pour les services : Chaque service expose une interface (I*Service) garantissant l'abstraction et la testabilité
src/main/java/com/e_com/e_com_spring/
├── controller/ # Points d'entrée de l'API REST organisés par domaine
│ ├── admin/ # Controllers pour les opérations administratives
│ └── auth/ # Controller d'authentification (partagé)
│
├── service/ # Logique métier organisée par domaine
│ ├── admin/ # Services administratifs
│ │ ├── category/ # Gestion des catégories
│ │ ├── delivery/ # Gestion des livraisons (vue admin)
│ │ ├── product/ # Gestion des produits
│ │ └── user/ # Gestion des utilisateurs
│ │
│ ├── auth/ # Service d'authentification (partagé)
│ │
│ ├── client/ # Services pour les clients
│ │ ├── cart/ # Gestion du panier
│ │ ├── catalog/ # Consultation du catalogue
│ │ ├── order/ # Gestion des commandes
│ │ └── payment/ # Gestion des paiements (simulés)
│ │
│ └── deliveryPerson/ # Services pour les livreurs
│ └── delivery/ # Gestion des livraisons (vue livreur)
│
├── dto/ # Objets de transfert de données organisés par domaine
│ ├── auth/ # DTOs d'authentification
│ └── user/ # DTOs utilisateur
│
├── mapper/ # Mappers MapStruct pour conversion Entité ↔ DTO
│
├── model/ # Entités JPA et modèles partagés
│ ├── auditing/ # Infrastructure d'audit
│ ├── Privilege.java
│ ├── Role.java
│ ├── RoleType.java
│ └── User.java
│
├── security/ # Configuration de sécurité et JWT
│
└── config/ # Configurations diverses
└── auditing/ # Configuration de l'audit
- Service :
service/auth/IAuthService - Controller :
controller/auth/AuthenticationController - Responsabilité : Gestion de l'authentification et de l'autorisation (inscription, connexion, génération JWT)
- Services :
service/client/cart/ICartService: Gestion du panierservice/client/catalog/ICatalogService: Consultation du catalogueservice/client/order/IOrderService: Gestion des commandesservice/client/payment/IPaymentService: Simulation de paiement
- Responsabilités : Toutes les fonctionnalités dédiées aux clients (consultation, achat, commande)
- Services :
service/admin/product/IProductService: CRUD produitsservice/admin/category/ICategoryService: Gestion des catégoriesservice/admin/user/IUserService: Gestion des utilisateursservice/admin/delivery/IDeliveryService: Attribution des livraisons
- Responsabilités : Administration complète de la plateforme
- Service :
service/deliveryPerson/IDeliveryService - Responsabilité : Mise à jour du statut des livraisons
Maintenabilité : Chaque domaine est indépendant, facilitant les modifications Testabilité : Services isolés et interfaces claires Scalabilité : Facilite l'ajout de nouvelles fonctionnalités par domaine Clarté : Structure intuitive reflétant les acteurs métier Réutilisabilité : Services réutilisables au sein d'un même domaine Séparation des responsabilités : Chaque service a un rôle précis et limité
Ce projet applique rigoureusement les principes du TDD (Test-Driven Development) :
- Écriture des tests avant le code : Les spécifications sont d'abord traduites en tests
- Refactoring continu : Le code est amélioré en permanence tout en maintenant les tests verts
- Documentation vivante : Les tests servent de documentation exécutable du comportement attendu
- Confiance dans le refactoring : La suite de tests complète permet de modifier le code en toute sécurité
Les tests d'intégration sont au cœur de la stratégie de qualité du projet :
- Testcontainers : Utilisation de conteneurs Docker pour créer des environnements de test réalistes
- PostgreSQL en conteneur : Chaque test d'intégration s'exécute avec une instance PostgreSQL isolée via
@Containeret@ServiceConnection - Spring Boot Test : Configuration complète du contexte Spring pour les tests end-to-end
- MockMvc : Tests des endpoints REST avec validation complète des réponses HTTP
- Environnements isolés : Chaque test dispose de sa propre base de données
- Tests reproductibles : Même environnement à chaque exécution
- Tests réalistes : Utilisation d'une vraie base de données PostgreSQL
- Pas de pollution : Les tests ne s'affectent pas mutuellement
- CI/CD ready : Les tests peuvent s'exécuter dans n'importe quel environnement
- Tests d'authentification : Inscription, connexion, génération de JWT
- Tests de sécurité : Validation des rôles et permissions
- Tests de services : Validation de la logique métier avec persistance réelle
src/test/java/
├── controller/ # Tests d'intégration des endpoints REST
│ └── auth/ # Tests d'authentification avec Testcontainers
└── service/ # Tests unitaires et d'intégration des services
Note : Les tests d'intégration utilisent directement @Container et @ServiceConnection de Spring Boot Testcontainers, sans classe de configuration séparée.
Pour exécuter tous les tests (unitaires + intégration) :
./mvnw testPour exécuter uniquement les tests d'intégration :
./mvnw test -Dtest=*IntegrationTest- Couverture de code : Objectif de maintenir une couverture élevée
- Tests rapides : Optimisation pour une exécution rapide des tests unitaires
- Tests robustes : Tests d'intégration complets pour valider le comportement réel
Les migrations de base de données sont gérées par Liquibase et se trouvent dans src/main/resources/db/changelog/.
(May be)
- Système de promotions avancé
- Gestion des retours
- Support multi-devises
- Support multi-langues
MIT
alkaly02
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une issue ou une pull request.