Les événements métier (emails d'invitation, reset password, activation) bloquaient la réponse API en étant traités de manière synchrone. Ce commit route ces événements vers un transport AMQP asynchrone avec un worker dédié, garantissant des réponses API rapides et une gestion robuste des échecs. Le retry utilise une stratégie Fibonacci (1s, 1s, 2s, 3s, 5s, 8s, 13s) qui offre un bon compromis entre réactivité et protection des services externes. Les messages qui épuisent leurs tentatives arrivent dans une dead-letter queue Doctrine avec alerte email à l'admin. La commande console CreateTestActivationTokenCommand détecte désormais les comptes déjà actifs et génère un token de réinitialisation de mot de passe au lieu d'un token d'activation, évitant une erreur bloquante lors de la ré-invitation par un admin.
30 lines
1022 B
PHP
30 lines
1022 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Administration\Domain\Exception;
|
|
|
|
use App\Administration\Domain\Model\User\StatutCompte;
|
|
use App\Administration\Domain\Model\User\UserId;
|
|
use RuntimeException;
|
|
|
|
use function sprintf;
|
|
|
|
final class CompteNonActivableException extends RuntimeException
|
|
{
|
|
public static function carStatutIncompatible(UserId $userId, StatutCompte $statut): self
|
|
{
|
|
return new self(match ($statut) {
|
|
StatutCompte::ACTIF => 'Ce compte est déjà actif.',
|
|
StatutCompte::SUSPENDU => 'Ce compte est suspendu. Veuillez contacter votre établissement.',
|
|
StatutCompte::ARCHIVE => 'Ce compte est archivé. Veuillez contacter votre établissement.',
|
|
default => sprintf('Ce compte ne peut pas être activé (statut : %s).', $statut->value),
|
|
});
|
|
}
|
|
|
|
public static function carConsentementManquant(UserId $userId): self
|
|
{
|
|
return new self('Ce compte ne peut pas être activé : consentement parental manquant.');
|
|
}
|
|
}
|