Devlog #6 : Factory de Transporteurs, Gestion des Statuts et Migration Bruno
Focus : Architecture extensible pour les expéditeurs, machine à états métier et modernisation de l'outillage de développement.
🏭 Factory des Transporteurs (Carriers)
Pour gérer plusieurs transporteurs (Interne, La Poste, FedEx...) sans dupliquer la logique d'instanciation, j'ai appliqué le pattern Factory en m'appuyant sur un Enum PHP.
Fonctionnement
graph LR
A["Table carrier\n(technical_name: 'la_poste')"] --> B["CarrierType Enum\n(LA_POSTE, FEDEX, INTERNE)"]
B --> C["CarrierFactory::resolve()"]
C --> D["LaPosteShipmentService"]
C --> E["FedExShipmentService"]
C --> F["InterneShipmentService"]
- La table
carrierstocke un champtechnical_name(ex:la_poste,fedex,interne). - Ce nom technique est mappé sur un Enum PHP (
CarrierType) pour éviter les chaînes magiques. - La
CarrierFactoryrésout le bon service de transporteur à partir de cet Enum.
Ce point d'entrée unique garantit le principe DRY : ajouter un nouveau transporteur ne nécessite qu'une nouvelle entrée en base, un cas dans l'Enum et un service dédié.
🔄 Machine à États : getNextStatus
La gestion des statuts de commande a été formalisée via une méthode getNextStatus qui encapsule les transitions valides selon le flux métier.
Le projet gère deux flux distincts :
stateDiagram-v2
direction LR
[*] --> PENDING
PENDING --> IN_TRANSIT : Produit en stock
PENDING --> IN_BUILD : Produit sur mesure
IN_BUILD --> IN_TRANSIT
IN_TRANSIT --> OUT_FOR_DELIVERY
OUT_FOR_DELIVERY --> DELIVERED : État final nominal
Cette approche interdit les transitions illégales et centralise toutes les règles de workflow en un seul endroit. Le projet gère deux flux distincts selon le type de produit (ProductType) :
IN_STOCK:PENDING → IN_TRANSIT → OUT_FOR_DELIVERY → DELIVEREDCUSTOM_MADE:PENDING → IN_BUILD → IN_TRANSIT → OUT_FOR_DELIVERY → DELIVERED
🐛 Corrections et Robustesse
Plusieurs bugs identifiés lors des sessions de tests ont été corrigés :
| Bug | Cause | Correction |
|---|---|---|
| Désérialisation de DTO | Deux repositories lisaient un objet DTO comme une string |
Correction de la résolution de type dans les appels Doctrine |
| Utilisateur supprimé | Commentaire lié à un compte supprimé provoquait une NullPointerException |
Tolérance de la valeur null avec une valeur de substitution |
Validation des publicId |
Règle de validation incorrecte (20 caractères au lieu de 22) | Mise à jour de la contrainte de longueur |
🔧 Migration vers Bruno
La collection de tests API a été migrée de Postman vers Bruno.
| Critère | Postman | Bruno |
|---|---|---|
| Compte requis | ✅ Oui | ❌ Non |
| Stockage des requêtes | Cloud | Fichiers locaux |
| Versionnement Git | ⚠️ Difficile | ✅ Natif |
| Performance | Lente (sync cloud) | Rapide |
| Open Source | Non | ✅ Oui |
La collection est désormais versionnée dans le répertoire ApiCollection/ du projet backend. Chaque nouvelle route doit être accompagnée de sa requête Bruno avant le push — cela garantit que la documentation de l'API reste synchronisée avec le code.