Projet A: Plateforme E-Commerce
Description
Developper une API RESTful complete pour une plateforme de commerce electronique permettant la gestion des produits, des utilisateurs, du panier et des commandes.
Fonctionnalites Requises
1. Gestion des Utilisateurs
POST /api/auth/register - Inscription
POST /api/auth/login - Connexion (retourne JWT)
GET /api/users/me - Profil utilisateur
PUT /api/users/me - Modifier profil
Entite User:
- id, email, password, firstName, lastName
- role (CUSTOMER, ADMIN)
- createdAt, updatedAt
2. Catalogue de Produits
GET /api/products - Liste des produits (pagination)
GET /api/products/{id} - Detail d'un produit
GET /api/products/search - Recherche par nom/categorie
POST /api/products - Creer produit (ADMIN)
PUT /api/products/{id} - Modifier produit (ADMIN)
DELETE /api/products/{id} - Supprimer produit (ADMIN)
Entite Product:
- id, name, description, price, stock
- category (relation ManyToOne)
- imageUrl, active
Entite Category:
- id, name, description
3. Panier
GET /api/cart - Voir le panier
POST /api/cart/items - Ajouter un produit
PUT /api/cart/items/{id} - Modifier quantite
DELETE /api/cart/items/{id} - Supprimer du panier
DELETE /api/cart - Vider le panier
Entite CartItem:
- id, cart, product, quantity, price
4. Commandes
POST /api/orders - Creer commande (depuis panier)
GET /api/orders - Liste des commandes (user)
GET /api/orders/{id} - Detail commande
PUT /api/orders/{id}/status - Modifier statut (ADMIN)
GET /api/admin/orders - Toutes les commandes (ADMIN)
Entite Order:
- id, user, items, totalAmount
- status (PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED)
- shippingAddress, createdAt
Schema de Base de Donnees
users
├── id (PK)
├── email (UNIQUE)
├── password
├── first_name
├── last_name
├── role
└── created_at
categories
├── id (PK)
├── name
└── description
products
├── id (PK)
├── name
├── description
├── price
├── stock
├── category_id (FK)
├── image_url
└── active
carts
├── id (PK)
└── user_id (FK, UNIQUE)
cart_items
├── id (PK)
├── cart_id (FK)
├── product_id (FK)
├── quantity
└── price
orders
├── id (PK)
├── user_id (FK)
├── total_amount
├── status
├── shipping_address
└── created_at
order_items
├── id (PK)
├── order_id (FK)
├── product_id (FK)
├── quantity
├── price
└── product_name
Regles Metier
Stock
- Verifier la disponibilite avant ajout au panier
- Decrementer le stock lors de la commande
- Restaurer le stock si commande annulee
Prix
- Le prix dans le panier doit etre celui du moment
- Le prix dans la commande est fige
Panier
- Un utilisateur a un seul panier
- Le panier est cree automatiquement
- Le panier est vide apres une commande
Commandes
- Seul l'utilisateur peut voir ses commandes
- Admin peut voir toutes les commandes
- Transitions de statut valides:
- PENDING -> CONFIRMED -> SHIPPED -> DELIVERED
- PENDING -> CANCELLED
- CONFIRMED -> CANCELLED
Endpoints Detailles
Authentification
POST /api/auth/register
Content-Type: application/json
{
"email": "john@example.com",
"password": "Password123!",
"firstName": "John",
"lastName": "Doe"
}
Response 201:
{
"id": 1,
"email": "john@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "CUSTOMER"
}
POST /api/auth/login
Content-Type: application/json
{
"email": "john@example.com",
"password": "Password123!"
}
Response 200:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "Bearer",
"expiresIn": 86400
}
Produits
GET /api/products?page=0&size=10&category=electronics
Authorization: Bearer <token>
Response 200:
{
"content": [
{
"id": 1,
"name": "Laptop Pro",
"description": "High-performance laptop",
"price": 999.99,
"stock": 50,
"category": {
"id": 1,
"name": "Electronics"
},
"imageUrl": "https://..."
}
],
"page": 0,
"size": 10,
"totalElements": 100,
"totalPages": 10
}
Panier
POST /api/cart/items
Authorization: Bearer <token>
Content-Type: application/json
{
"productId": 1,
"quantity": 2
}
Response 200:
{
"items": [
{
"id": 1,
"product": { "id": 1, "name": "Laptop Pro", ... },
"quantity": 2,
"price": 999.99,
"subtotal": 1999.98
}
],
"totalItems": 2,
"totalAmount": 1999.98
}
Commandes
POST /api/orders
Authorization: Bearer <token>
Content-Type: application/json
{
"shippingAddress": "123 Main St, City, 12345"
}
Response 201:
{
"id": 1,
"status": "PENDING",
"items": [...],
"totalAmount": 1999.98,
"shippingAddress": "123 Main St, City, 12345",
"createdAt": "2024-01-15T10:30:00"
}
Tests Requis
Tests Unitaires
- ProductService: CRUD operations
- CartService: add, update, remove items
- OrderService: create order, validate stock
Tests Integration
- ProductController: all endpoints
- CartController: cart operations
- OrderController: order workflow
Bonus Points
| Fonctionnalite | Points |
|---|---|
| Cache Redis sur les produits | +5 |
| Notification email (simulation) | +3 |
| Recherche full-text | +3 |
| Export commandes CSV | +2 |
| Docker Compose complet | +5 |
| Swagger documentation | +5 |
Estimation Temps
| Tache | Heures |
|---|---|
| Setup projet et DB | 2 |
| Entites et repositories | 4 |
| Services metier | 6 |
| Controllers REST | 4 |
| Securite JWT | 4 |
| Tests | 6 |
| Documentation | 2 |
| Bonus | 4-8 |
| Total | 28-36 |