Skip to content

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"]
  1. La table carrier stocke un champ technical_name (ex: la_poste, fedex, interne).
  2. Ce nom technique est mappé sur un Enum PHP (CarrierType) pour éviter les chaînes magiques.
  3. La CarrierFactory ré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 → DELIVERED
  • CUSTOM_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.