eadl:bloc3:dev_av:td4

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
eadl:bloc3:dev_av:td4 [2025/11/09 19:50] – [3.4 NotificationService avec Pattern Factory] jcheroneadl:bloc3:dev_av:td4 [2025/11/10 16:28] (Version actuelle) – [Concepts clés à retenir] jcheron
Ligne 166: Ligne 166:
 ==== 1.1 Structure modulaire proposée ==== ==== 1.1 Structure modulaire proposée ====
  
-<sxh bash>+<sxh bash;gutter:false>
 src/main/kotlin/com/ecommerce/ src/main/kotlin/com/ecommerce/
 ├── order/                          # Domaine Order ├── order/                          # Domaine Order
Ligne 202: Ligne 202:
 │       └── NotificationConfig.kt │       └── NotificationConfig.kt
  
-├── product/                        # Domaine Product (existant)+├── product/                        # Domaine Product
 │   ├── domain/ │   ├── domain/
 │   ├── service/ │   ├── service/
 │   └── ... │   └── ...
  
-└── user/                           # Domaine User (existant)+└── user/                           # Domaine User
     ├── domain/     ├── domain/
     ├── service/     ├── service/
Ligne 1305: Ligne 1305:
 </uml> </uml>
 <html></div></html> <html></div></html>
 +
 +===== Partie 7 : Visualiser les emails avec MailPit (Bonus : 10min) =====
 +
 +<WRAP round bloc info>
 +**Mailpit** = Serveur SMTP de test avec interface web moderne
 +  * Capture tous les emails envoyés par l'application
 +  * Interface web pour visualiser les emails
 +  * Aucune configuration SMTP complexe
 +  * Parfait pour le développement
 +</WRAP>
 +
 +==== 7.1 Ajouter Mailpit au docker-compose.yml ====
 +
 +Ajouter ce service dans votre fichier **''docker-compose.yml''** :
 +
 +<sxh yaml>
 +  mailpit:
 +    image: axllent/mailpit:latest
 +    container_name: ecommerce-mailpit
 +    ports:
 +      - "1025:1025"  # SMTP
 +      - "8025:8025"  # Web UI
 +    networks:
 +      - ecommerce-network
 +</sxh>
 +
 +<sxh bash>
 +# Démarrer Mailpit
 +docker-compose up -d mailpit
 +
 +# Vérifier que Mailpit est démarré
 +docker ps | grep mailpit
 +</sxh>
 +
 +==== 7.2 Configuration Spring ====
 +
 +Modifier le fichier **''src/main/resources/application-dev.properties''** :
 +
 +<sxh properties>
 +# Mailpit configuration
 +spring.mail.host=localhost
 +spring.mail.port=1025
 +spring.mail.username=
 +spring.mail.password=
 +spring.mail.properties.mail.smtp.auth=false
 +spring.mail.properties.mail.smtp.starttls.enable=false
 +
 +# Notification settings
 +notification.email.enabled=true
 +notification.email.from=noreply@ecommerce-demo.com
 +
 +# Logs pour voir les envois
 +logging.level.org.springframework.mail=DEBUG
 +</sxh>
 +
 +Modifier également **''src/test/resources/application-test.properties''** :
 +
 +<sxh properties>
 +# Mailpit pour les tests
 +spring.mail.host=localhost
 +spring.mail.port=1025
 +
 +notification.email.enabled=true
 +notification.email.from=test@ecommerce-demo.com
 +</sxh>
 +
 +==== 7.3 Améliorer les logs dans EmailNotificationSender ====
 +
 +Modifier la méthode **''send()''** dans **''EmailNotificationSender.kt''** :
 +
 +<sxh kotlin>
 +override fun send(recipient: String, subject: String, content: String) {
 +    try {
 +        val message = mailSender.createMimeMessage()
 +        val helper = MimeMessageHelper(message, true, "UTF-8")
 +        
 +        helper.setFrom(fromEmail)
 +        helper.setTo(recipient)
 +        helper.setSubject(subject)
 +        helper.setText(content, true)
 +        
 +        mailSender.send(message)
 +        
 +        logger.info("✅ Email sent to: $recipient - Subject: $subject")
 +        logger.info("🌐 View in Mailpit: http://localhost:8025")
 +        
 +    } catch (e: Exception) {
 +        logger.error("❌ Failed to send email to $recipient", e)
 +        throw RuntimeException("Email sending failed", e)
 +    }
 +}
 +</sxh>
 +
 +==== 7.4 Test manuel ====
 +
 +<sxh bash>
 +# 1. Démarrer Mailpit (si pas déjà fait)
 +docker-compose up -d mailpit
 +
 +# 2. Lancer l'application avec le profil dev
 +mvn spring-boot:run -P dev
 +
 +# 3. Créer une commande pour déclencher l'envoi d'email
 +curl -X POST http://localhost:8080/api/orders \
 +  -H "Content-Type: application/json" \
 +  -d '{
 +    "customerId": 1,
 +    "customerEmail": "test@example.com",
 +    "items": [
 +      {
 +        "productId": 1,
 +        "quantity": 2,
 +        "price": 29.99
 +      }
 +    ]
 +  }'
 +
 +# 7.4 Ouvrir l'interface Mailpit
 +open http://localhost:8025
 +# Ou dans votre navigateur : http://localhost:8025
 +</sxh>
 +
 +<WRAP round bloc todo>
 +**Vérifications à effectuer :**
 +  1. Ouvrir http://localhost:8025 dans votre navigateur
 +  2. Vérifier qu'un email apparaît dans la liste
 +  3. Cliquer sur l'email pour voir son contenu
 +  4. Vérifier que le contenu HTML est correct
 +  5. Vérifier le sujet : "Order Confirmation #XXX"
 +  6. Vérifier les détails de la commande dans l'email
 +</WRAP>
 +
 +==== 7.5 Interface Mailpit ====
 +
 +L'interface web de Mailpit (http://localhost:8025) permet de :
 +  * Voir tous les emails envoyés
 +  * Rechercher dans les emails
 +  * Prévisualiser le HTML et le texte brut
 +  * Voir les pièces jointes
 +  * Supprimer les emails
 +  * Tester le responsive design des emails
 +
 +==== 7.6 Configuration pour la production ====
 +
 +<WRAP round bloc important>
 +** Mailpit est uniquement pour le développement !**
 +
 +En **développement** (Mailpit) :
 +<sxh properties>
 +spring.mail.host=localhost
 +spring.mail.port=1025
 +notification.email.enabled=true
 +</sxh>
 +
 +En **production** (SMTP réel - exemple avec Gmail) :
 +<sxh properties>
 +spring.mail.host=smtp.gmail.com
 +spring.mail.port=587
 +spring.mail.username=${SMTP_USERNAME}
 +spring.mail.password=${SMTP_PASSWORD}
 +spring.mail.properties.mail.smtp.auth=true
 +spring.mail.properties.mail.smtp.starttls.enable=true
 +
 +notification.email.enabled=true
 +notification.email.from=${EMAIL_FROM}
 +</sxh>
 +
 +** Bonnes pratiques :**
 +  * Ne **jamais** commiter les credentials SMTP dans le code
 +  * Utiliser des **variables d'environnement**
 +  * Activer **TLS/SSL** en production
 +  * Utiliser des **app passwords** (Gmail, Outlook, etc.)
 +</WRAP>
 +
 +==== 7.7 Commandes utiles ====
 +
 +<sxh bash>
 +# Démarrer uniquement Mailpit
 +docker-compose up -d mailpit
 +
 +# Voir les logs de Mailpit
 +docker logs -f ecommerce-mailpit
 +
 +# Redémarrer Mailpit
 +docker-compose restart mailpit
 +
 +# Arrêter Mailpit
 +docker-compose stop mailpit
 +
 +# Supprimer le conteneur Mailpit
 +docker-compose down mailpit
 +</sxh>
 +
 +==== 7.8 Dépannage ====
 +
 +**Problème : Les emails n'apparaissent pas dans Mailpit**
 +
 +<sxh bash>
 +# 1. Vérifier que Mailpit est démarré
 +docker ps | grep mailpit
 +
 +# 2. Vérifier les logs de l'application
 +# Rechercher : "Email sent to:" ou "Failed to send email"
 +
 +# 3. Vérifier que le profil dev est actif
 +# Dans les logs au démarrage : "The following profiles are active: dev"
 +
 +# 4. Tester la connexion SMTP
 +telnet localhost 1025
 +</sxh>
 +
 +**Problème : "Connection refused" sur le port 1025**
 +
 +<code>
 +# Vérifier que le port 1025 n'est pas déjà utilisé
 +lsof -i :1025
 +
 +# Si occupé, changer le port dans docker-compose.yml et application-dev.properties
 +</code>
 +
 +
 +
 +
 +
  
 ===== Livrables attendus ===== ===== Livrables attendus =====
Ligne 1340: Ligne 1564:
  
   * Ajout du canal SMS   * Ajout du canal SMS
-  * Template d'email avec Thymeleaf+  * Template d'email avec Thymeleaf/mustache
   * Retry automatique en cas d'échec   * Retry automatique en cas d'échec
   * Dashboard des notifications dans H2 console   * Dashboard des notifications dans H2 console
Ligne 1353: Ligne 1577:
   * **Observer** : Spring Events pour la communication inter-domaines   * **Observer** : Spring Events pour la communication inter-domaines
   * **Strategy** : ''NotificationSender'' avec différentes implémentations   * **Strategy** : ''NotificationSender'' avec différentes implémentations
-  * **Factory** : Injection automatique de tous les senders+  * **Factory** : Injection automatique de tous les senders (pas le pattern Factory en lui-même)
   * **Dependency Inversion** : ''OrderService'' ne dépend que d'abstractions   * **Dependency Inversion** : ''OrderService'' ne dépend que d'abstractions
  
  • eadl/bloc3/dev_av/td4.1762714237.txt.gz
  • Dernière modification : il y a 3 mois
  • de jcheron