Module 02
⭐⭐ Moyen
~2h
🛍️ API Catalogue Produits
Créer une API de catalogue produits complète avec controllers, routes avancées, query params, et providers. Gérer la pagination, le tri, et le filtrage.
🎯 Objectifs
- Controller avec routes imbriquées (
/categories/:id/products) - Query params typés avec DefaultValuePipe et ParseIntPipe
- Route statique avant route paramétrique (
/products/featuredavant/products/:id) - Scope REQUEST pour un service de panier temporaire
- Factory provider pour la configuration de prix
🔧 Code de démarrage
// products.controller.ts — à compléter
@Controller('products')
export class ProductsController {
constructor(private readonly productsService: ProductsService) {}
// GET /products/featured — DOIT être AVANT /products/:id !
@Get('featured')
getFeatured() { ... }
// GET /products?page=1&limit=10&sort=price&order=asc&category=electronics
@Get()
findAll(
@Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number,
@Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number,
@Query('sort', new DefaultValuePipe('createdAt')) sort: string,
@Query('order', new DefaultValuePipe('desc')) order: 'asc' | 'desc',
@Query('category') category?: string,
@Query('minPrice', new DefaultValuePipe(0), ParseFloatPipe) minPrice?: number,
@Query('maxPrice', ParseFloatPipe) maxPrice?: number,
) { ... }
// GET /products/:id
@Get(':id')
findOne(@Param('id') id: string) { ... }
// GET /products/:id/related
@Get(':id/related')
getRelated(@Param('id') id: string) { ... }
}
✅ Endpoints à implémenter
| Route | Description |
|---|---|
| GET /products | Pagination + tri + filtres prix/catégorie |
| GET /products/featured | Produits mis en avant (top 6) |
| GET /products/:id | Détail + incrémente vues |
| GET /products/:id/related | Produits similaires (même catégorie) |
| GET /categories/:id/products | Produits d'une catégorie |
| POST /products/:id/reviews | Ajouter un avis |
Bonus : Ajoutez un service
CartService avec scope REQUEST pour un panier temporaire par requête. Ajoutez POST /cart et GET /cart.