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.
Service de notifications (e-mail & SMS & OTP) développé en Node.js, Express et TypeScript.
Ce README décrit l'installation, la configuration, les endpoints, les variables d'environnement et les bonnes pratiques pour déployer et tester le service.
Table des matières
- Présentation
- Prérequis
- Installation
- Variables d'environnement
- Commandes utiles
- Endpoints et exemples
- Health checks
- Docker / Compose
- Débogage et logs
- Notes de sécurité
Ce service reçoit des requêtes HTTP pour envoyer des notifications et générer/vérifier des OTP. Il s'intègre avec :
- PostgreSQL (TypeORM)
- RabbitMQ (échange partagé, queue privée)
- Twilio (SMS)
- Nodemailer (e-mail)
Le code organise les responsabilités en contrôleurs, services, entités, utilitaires et messaging (publisher/consumer).
- Node.js >= 18
- npm
- PostgreSQL accessible (ou instance locale)
- RabbitMQ accessible (ou instance locale)
- Compte Twilio (si SMS en production) ou configuration de mock
- Compte e-mail (Gmail ou SMTP compatible) pour envoi d'e-mails
- Cloner le dépôt et positionnez-vous dans le dossier du service :
cd notification_service- Installer les dépendances :
npm install
- Compiler TypeScript :
npm run build
- Lancer en développement (reload automatique) :
npm run dev
Les variables attendues par le service (fichier
.envrecommandé) :-
SERVICE_PORT: port d'écoute HTTP (ex: 8000)
-
SERVICE_VERSION: version déployée (optionnel)
-
COMMIT_SHA: sha du commit déployé (optionnel)
-
PostgreSQL:
- DB_HOST
- DB_PORT (par défaut 5432)
- DB_USER
- DB_PASSWORD
- DB_NAME
-
RabbitMQ:
- RABBITMQ_URL (ex: amqp://user:pass@host:5672)
- RABBITMQ_EXCHANGE (nom de l'exchange partagé)
- RABBITMQ_QUEUE (nom de la queue principale pour ce service)
-
Twilio (si SMS) :
- TWILIO_ACCOUNT_SID
- TWILIO_AUTH_TOKEN
- TWILIO_PHONE_NUMBER
-
E-mail (Nodemailer) :
- MAIL_USER
- MAIL_PASS
-
Health / diagnostics (optionnel) :
- HEALTH_CHECK_TIMEOUT_MS (ms, défaut 1000)
- HEALTH_CACHE_TTL_MS (ms, défaut 5000)
- HEALTH_EXPOSE_ERRORS (true|false, défaut false)
npm run dev— démarre avects-node-dev(dev hot-reload)npm run build— compile TypeScript versdist/npm start— exécutenode src/server.ts(production si compilé)
Base URL:
http://{host}:{SERVICE_PORT}Health
GET /health— liveness minimal (retourne OK + uptime)GET /health/ready— readiness : vérifie PostgreSQL et RabbitMQ, retourne 200 ou 503. Réponse contientcomponents.dbetcomponents.rabbitmq.
Notifications
-
POST /api/notifications/envoyer— envoie une notification.-
Corps possible (exemples) :
Transfer (expéditeur + destinataire envoyés sur SMS + email si fournis) :
{ "type": "transfer", "sender": { "email": "a@ex.com", "phone": "+223xxxxxxxx" }, "receiver": { "email": "b@ex.com", "phone": "+223yyyyyyyy" }, "amount": 10000, "content": "Votre transfert de 10000 F CFA a été effectué" }Simple notification :
{ "type": "alert_securite", "user": { "email": "u@ex.com", "phone": "+223zzzzzzzz" }, "content": "Un événement important a eu lieu" } -
Réponse :
201+ objet décrivant les enregistrements créés (sms / email)
-
-
POST /api/notifications/rabbitmq— endpoint de test qui publie un message sur RabbitMQ (routingKey/message dans body)
OTP
-
POST /api/notifications/otp/generate— génère un OTP- Body example:
{ "utilisateurId": "user-123", "canalNotification": "SMS", "phone": "+223..." }
- Body example:
-
POST /api/notifications/otp/verify— vérifie un OTP- Body example:
{ "utilisateurId": "user-123", "code": "1234" }
- Body example:
/healthest une probe de liveness simple, utile pour Kubernetes readiness/liveness probes basiques./health/readyexécute des vérifications actives :- exécute
SELECT 1sur PostgreSQL (avec timeout configurable) - vérifie que le channel RabbitMQ est initialisé
- met en cache le résultat pendant
HEALTH_CACHE_TTL_MSpour limiter la charge - renvoie
versionetcommitsi disponibles
- exécute
Le repo contient un
Dockerfileet undocker-compose.yml:Construction :
docker build -t ricash/notification-service:latest .Compose (exemple très simple) :
version: "3.8" services: notification-service: image: ricash/notification-service:latest env_file: .env ports: - "8000:8000" depends_on: - db - rabbitmq db: image: postgres:15 environment: POSTGRES_USER: example POSTGRES_PASSWORD: example POSTGRES_DB: ricash rabbitmq: image: rabbitmq:3-management ports: - "5672:5672" - "15672:15672"
- Les logs sont écrits sur stdout.
- Vérifier les erreurs de connexion à RabbitMQ et PostgreSQL au démarrage.
- En cas d'erreurs d'envoi SMS/Email, les exceptions sont loggées et le statut de la notification est mis à
ECHEC.
- Ne pas exposer
HEALTH_EXPOSE_ERRORS=trueen production si les messages d'erreur contiennent des données sensibles. - Utiliser des secrets manager pour les identifiants (DB, Twilio, MAIL_PASS).
- Désactiver
synchronize: true(TypeORM) en production et utiliser des migrations contrôlées.
Pour proposer des améliorations :
- Créer une branche feature
- Ajouter tests / valider localement
- Ouvrir une Pull Request vers
develop
Si tu veux, je peux :
- ajouter des exemples Postman
- créer un
docker-compose.dev.ymlcomplet pour démarrer la stack locale - ajouter des tests unitaires pour
NotificationService/OtpService
Fait avec ❤️ — Notification-Service