Ce projet implémente un service de notifications en Node.js, Express et TypeScript.
Il gère deux fonctionnalités principales :
- La génération et la vérification d’OTP (codes à usage unique).
- L’envoi de notifications (par e-mail,SMS ou autres canaux).
- Génération et validation d’OTP avec expiration automatique.
- Envoi de notifications personnalisées via des templates.
- Architecture modulaire : contrôleurs, services, entités, utilitaires.
Tous les endpoints sont accessibles sous :
/api/notifications
- Génération et validation d’OTP avec expiration automatique.
- Envoi de notifications personnalisées via des templates.
- Intégration RabbitMQ : consommation d’événements de
wallet-service(dépôt, retrait, transfert, OTP…) et transformation en notifications. - Validation stricte des payloads HTTP avec Zod (emails et téléphones obligatoires, structure
transferdédiée, etc.).
Tous les endpoints HTTP exposés par ce service sont préfixés par :
/api/notifications
POST /api/notifications/envoyer
Depuis la refonte, le service est strictement dépendant des coordonnées fournies dans le JSON. Deux formes sont possibles :
{
"type": "transfer",
"sender": {
"email": "expediteur@mail.com",
"phone": "+22300000000"
},
"receiver": {
"email": "destinataire@mail.com",
"phone": "+22311111111"
},
"amount": 5000,
"content": "Transfert de 5000 FCFA réussi."
}- Le schéma Zod impose :
type="transfer".sender.email/sender.phoneobligatoires.receiver.email/receiver.phoneobligatoires.amount > 0.contentnon vide.
- Le service crée deux paires de notifications (SMS + EMAIL) :
- Pour l’expéditeur (role =
SENDER). - Pour le destinataire (role =
RECEIVER).
- Pour l’expéditeur (role =
- Les messages sont envoyés :
- par SMS via Twilio sur
phone. - par email via
mailService.sendEmailsuremail.
- par SMS via Twilio sur
- Le
contextdes entitésNotificationcontient notammentmontantetrole.
{
"type": "ALERT_SECURITE",
"user": {
"email": "client@mail.com",
"phone": "+22322222222"
},
"content": "Connexion suspecte détectée."
}typepeut être l’une des valeurs deTypeNotification(sauf"transfer"qui utilise le schéma dédié).user.emailetuser.phonesont obligatoires.- Le service envoie systématiquement la notification à la fois par SMS et par email.
En cas de JSON invalide (champ manquant / mauvais type), le contrĂ´leur renvoie :
{
"success": false,
"message": "Corps de requĂŞte invalide",
"errors": { ...détail Zod... }
}POST /api/notifications/otp/generate
Le service génère un code OTP (4 chiffres), l’enregistre en base avec une expiration (5 minutes) puis publie un événement otp.verification sur RabbitMQ. Désormais, il dépend strictement des coordonnées envoyées dans le JSON.
{
"utilisateurId": "user-otp-1",
"canalNotification": "SMS",
"email": "userotp@mail.com",
"phone": "+22300000000"
}utilisateurId: identifiant métier (user id).canalNotification:"SMS"ou"EMAIL".email: email du destinataire (obligatoire).phone: numéro du destinataire (obligatoire).
│ │ ├── Notification.ts # Modèle de données pour les notifications
L’événement publié (contrat inter-services) contient :
{
"utilisateurId": "user-otp-1",
"typeNotification": "VERIFICATION_TELEPHONE",
"canal": "SMS",
"context": { "code": "1234" },
"email": "userotp@mail.com",
"phone": "+22300000000",
"metadata": {
"service": "notification-service:otp",
"correlationId": "otp-<id>"
}
}Les templates de message utilisent ce context pour produire des textes explicites, par exemple :
VERIFICATION_TELEPHONE:« Votre code OTP de vérification téléphone est : {code}. Ce code est valable 5 minutes. Ne le partagez jamais avec un tiers. »
POST /api/notifications/otp/verify
Body JSON :
{
"utilisateurId": "user-otp-1",
"code": "1234"
}Réponses possibles :
{ "success": true, "message": "OTP validé" }
{ "success": false, "message": "Code invalide" }
{ "success": false, "message": "Code expiré" }
{ "success": false, "message": "Ce code a déjà été utilisé" }│ │ ├── Otp.ts # Modèle de données pour les OTP (code, expiration, utilisateur) │ │ │ ├── routes/ │ │ ├── notificationRoutes.ts # Définition des routes Express pour les notifications et OTP │ │ │ ├── services/ │ │ ├── notificationService.ts # Logique métier liée aux notifications │ │ ├── otpService.ts # Logique métier liée aux OTP │ │ │ ├── utils/ │ │ ├── mailService.ts # Gère l’envoi des e-mails (transporteur, configuration…) │ │ ├── messageTemplates.ts # Contient les templates des messages │ │ │ ├── app.ts # Configuration principale de l’application Express │ ├── data-source.ts # Configuration et connexion à la base de données │ ├── index.ts # Point d’entrée pour la déclaration des routes │ ├── server.ts # Lancement du serveur Express │ ├── .env # Variables d’environnement (PORT, DB_URL, etc.) ├── package.json # Dépendances et scripts du projet ├── tsconfig.json # Configuration TypeScript