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
| Canal | Valeur | Statut | Implémentation |
|---|---|---|---|
email / Email | ✅ Fonctionnel | SendGrid v3 Mail Send API | |
| SMS | sms / Sms | ⚠️ Stub | Log uniquement, aucun envoi |
whatsapp / WhatsApp | ⚠️ Stub | Log uniquement, aucun envoi | |
| Webhook | webhook / Webhook | 🔧 Config | Pas 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énement | Description |
|---|---|
transaction.recharge_completed | Rechargement réussi |
transaction.purchase_completed | Achat effectué |
transaction.correction_applied | Correction appliquée |
card.created / card.activated / card.deactivated | Cycle de vie carte |
card.balance_changed | Solde modifié |
product.deactivated | Produit désactivé |
product.stock_critical | Stock sous le seuil |
catalog.imported | Catalogue importé |
reservation.created / reservation.refunded | Réservation |
anomaly.detected / anomaly.notification_sent | Anomalie |
tenant.provisioned | Organisation provisionnée |
role.permission_changed | Permissions de rôle modifiées |
organization.config_changed | Configuration modifiée |
Templates envoyés
Le worker outbox_consumer crée des enregistrements de notification pour :
| Template | Canal | Destinataire | Déclencheur |
|---|---|---|---|
recharge_completed | sms | holder | Recharge réussie |
anomaly_alert | email | admin | Anomalie 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
- Implémenter le trait
NotificationChannel(danscrates/notification/src/). - Enregistrer le canal dans le
NotificationRouter. - Activer le canal dans
notification_config.channelsde l'organisation.
Voir aussi
- Notifications (API) — templates et notifications programmées
- Paramètres —
notification_config - Jobs —
outbox_consumer