Lorsqu'un super-admin crée un établissement via l'interface, le système doit automatiquement créer la base tenant, exécuter les migrations, créer le premier utilisateur admin et envoyer l'invitation — le tout de manière asynchrone pour ne pas bloquer la réponse HTTP. Ce mécanisme rend chaque établissement opérationnel dès sa création sans intervention manuelle sur l'infrastructure.
69 lines
3.4 KiB
YAML
69 lines
3.4 KiB
YAML
framework:
|
|
messenger:
|
|
failure_transport: failed
|
|
|
|
# Three buses: Command, Query, Event (CQRS + Event-driven)
|
|
default_bus: command.bus
|
|
|
|
buses:
|
|
command.bus:
|
|
default_middleware: true
|
|
middleware:
|
|
- App\Shared\Infrastructure\Messenger\AddCorrelationIdStampMiddleware
|
|
- App\Shared\Infrastructure\Messenger\CorrelationIdMiddleware
|
|
- App\Shared\Infrastructure\Messenger\TenantDatabaseMiddleware
|
|
- doctrine_transaction
|
|
|
|
query.bus:
|
|
default_middleware: true
|
|
middleware:
|
|
- App\Shared\Infrastructure\Messenger\AddCorrelationIdStampMiddleware
|
|
- App\Shared\Infrastructure\Messenger\CorrelationIdMiddleware
|
|
- App\Shared\Infrastructure\Messenger\TenantDatabaseMiddleware
|
|
|
|
event.bus:
|
|
default_middleware:
|
|
allow_no_handlers: true
|
|
middleware:
|
|
- App\Shared\Infrastructure\Messenger\AddCorrelationIdStampMiddleware
|
|
- App\Shared\Infrastructure\Messenger\CorrelationIdMiddleware
|
|
- App\Shared\Infrastructure\Messenger\TenantDatabaseMiddleware
|
|
- App\Administration\Infrastructure\Middleware\PaginatedCacheInvalidationMiddleware
|
|
- App\Shared\Infrastructure\Messenger\MessengerMetricsMiddleware
|
|
|
|
transports:
|
|
async:
|
|
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
|
|
options:
|
|
exchange:
|
|
name: classeo_messages
|
|
type: topic
|
|
queues:
|
|
messages:
|
|
binding_keys: ['#']
|
|
retry_strategy:
|
|
service: App\Shared\Infrastructure\Messenger\FibonacciRetryStrategy
|
|
|
|
failed:
|
|
dsn: 'doctrine://default?queue_name=failed'
|
|
|
|
routing:
|
|
# Email events → async (non-blocking API responses)
|
|
App\Administration\Domain\Event\UtilisateurInvite: async
|
|
App\Administration\Domain\Event\InvitationRenvoyee: async
|
|
App\Administration\Domain\Event\PasswordResetTokenGenerated: async
|
|
App\Administration\Domain\Event\CompteActive: async
|
|
App\Administration\Domain\Event\MotDePasseChange: async
|
|
# CompteBloqueTemporairement: sync (SendLockoutAlertHandler = immediate security alert)
|
|
# ConnexionReussie, ConnexionEchouee: sync (audit-only, no email)
|
|
# Parent invitation events → async (email sending)
|
|
App\Administration\Domain\Event\InvitationParentEnvoyee: async
|
|
App\Administration\Domain\Event\InvitationParentActivee: async
|
|
# Notification enseignants journée pédagogique → async (envoi d'emails)
|
|
App\Administration\Domain\Event\JourneePedagogiqueAjoutee: async
|
|
# Import élèves/enseignants → async (batch processing, peut être long)
|
|
App\Administration\Application\Command\ImportStudents\ImportStudentsCommand: async
|
|
App\Administration\Application\Command\ImportTeachers\ImportTeachersCommand: async
|
|
# Provisioning établissement → async (création BDD, migrations, premier admin)
|
|
App\SuperAdmin\Application\Command\ProvisionEstablishment\ProvisionEstablishmentCommand: async
|