Aller au contenu principal

Configuration des notifications

La Cafête supporte les notifications multi-canal. Seul l'email est réellement implémenté ; SMS et WhatsApp sont des stubs.

Canaux​

CanalValeurStatutImplémentation
Emailemail / Email✅ FonctionnelSendGrid v3 Mail Send API
SMSsms / Sms⚠️ StubLog uniquement, aucun envoi
WhatsAppwhatsapp / WhatsApp⚠️ StubLog uniquement, aucun envoi
Webhookwebhook / Webhook🔧 ConfigPas d'envoi

Email (SendGrid v3)​

Configuration par variables d'environnement :

CAFFETTE_EMAIL_API_KEY=SG.votre-cle-sendgrid
CAFFETTE_EMAIL_FROM=noreply@caffette.app

L'appel utilise https://api.sendgrid.com/v3/mail/send (Bearer token). Sans clé configurée, les envois sont journalisés mais non transmis.

Stubs SMS / WhatsApp​

SmsChannel::send() et WhatsAppChannel::send() tracent un info! mais n'émettent aucune requête HTTP. Aucun provider n'est configuré.


Structure de notification_config​

Stockée par organisation et exposée via GET /admin/org/settings :

{
"channels": {
"email": { "enabled": true },
"sms": { "enabled": false },
"whatsapp": { "enabled": false }
},
"event_routing": {
"anomaly_detected": ["email"],
"recharge_completed": ["email"]
},
"email_default_from": "noreply@caffette.app"
}
  • channels : activation par canal.
  • event_routing : mapping type d'événement → canaux. Le router ne diffuse que vers les canaux activés.
  • email_default_from : expéditeur par défaut.

Valeurs par défaut à la création d'une organisation : email activé, SMS/WhatsApp désactivés, routage anomaly_detected → ["email"].


Événements du domaine​

Les événements sont émis par les services et routés via la table outbox. Principaux types (DomainEvent::event_type) :

ÉvénementDescription
transaction.recharge_completedRechargement réussi
transaction.purchase_completedAchat effectué
transaction.correction_appliedCorrection appliquée
card.created / card.activated / card.deactivatedCycle de vie carte
card.balance_changedSolde modifié
product.deactivatedProduit désactivé
product.stock_criticalStock sous le seuil
catalog.importedCatalogue importé
reservation.created / reservation.refundedRéservation
anomaly.detected / anomaly.notification_sentAnomalie
tenant.provisionedOrganisation provisionnée
role.permission_changedPermissions de rôle modifiées
organization.config_changedConfiguration modifiée

Templates envoyés​

Le worker outbox_consumer crée des enregistrements de notification pour :

TemplateCanalDestinataireDéclencheur
recharge_completedsmsholderRecharge réussie
anomaly_alertemailadminAnomalie balance_low détectée

Les autres événements sont journalisés (pas encore de template).


Transactional Outbox​

sequenceDiagram
participant API
participant DB
participant Worker

API->>DB: INSERT outbox_events (status: pending)
Worker->>DB: UPDATE status = processing
Worker->>Worker: dispatch_event
alt Succès
Worker->>DB: UPDATE status = published
else Échec
Worker->>DB: UPDATE status = failed (retry_count++)
end

Le worker outbox_consumer tourne toutes les 10 secondes.


Ajouter un canal​

  1. Implémenter le trait NotificationChannel (dans crates/notification/src/).
  2. Enregistrer le canal dans le NotificationRouter.
  3. Activer le canal dans notification_config.channels de l'organisation.

Voir aussi​