|
3 | 3 | Ce projet implémente un **service de notifications** en **Node.js**, **Express** et **TypeScript**. |
4 | 4 | Il gère deux fonctionnalités principales : |
5 | 5 |
|
6 | | -- La génération et la vérification d’OTP (codes à usage unique). |
7 | | -- L’envoi de notifications (par e-mail,SMS ou autres canaux). |
8 | | - |
| 6 | +- La génération et la vérification d’OTP (codes à usage unique). |
| 7 | +- L’envoi de notifications (par e-mail,SMS ou autres canaux). |
9 | 8 |
|
10 | 9 | --- |
11 | 10 |
|
12 | | -## Fonctionnalités principales |
| 11 | +## Fonctionnalités principales |
13 | 12 |
|
14 | | -- Génération et validation d’OTP avec expiration automatique. |
15 | | -- Envoi de notifications personnalisées via des templates. |
| 13 | +- Génération et validation d’OTP avec expiration automatique. |
| 14 | +- Envoi de notifications personnalisées via des templates. |
16 | 15 | - Architecture modulaire : contrôleurs, services, entités, utilitaires. |
17 | 16 |
|
18 | 17 | --- |
19 | | -# Endpoints |
| 18 | + |
| 19 | +# Endpoints |
20 | 20 |
|
21 | 21 | Tous les endpoints sont accessibles sous :<br> |
22 | 22 | /api/notifications |
23 | | - |
24 | | - **Envoi d’une notification** |
25 | | - |
26 | | - Post /api/notifications/envoyer |
27 | | - |
28 | | - **Body json** <br> |
29 | | -{<br> |
30 | | - "utilisateurId": "+22350087965", <br> |
31 | | - "typeNotification": "CONFIRMATION_TRANSFERT",<br> |
32 | | - "canal": "SMS",<br> |
33 | | - "context": {<br> |
34 | | - "montant": 10000,<br> |
35 | | - "destinataire": "Aisha"<br> |
36 | | - }<br> |
37 | | -}<br> |
38 | | - |
39 | | -**Réponse json**<br> |
40 | | - |
41 | | -{<br> |
42 | | - "id": 42,<br> |
43 | | - "utilisateurId": "+22350087965",<br> |
44 | | - "typeNotification": "CONFIRMATION_TRANSFERT",<br> |
45 | | - "canal": "SMS",<br> |
46 | | - "message": "Votre transfert de 10000 F CFA à Aisha a été confirmé.",<br> |
47 | | - "statut": "ENVOYEE",<br> |
48 | | - "createdAt": "2025-12-02T20:10:00.000Z"<br> |
49 | | -}<br> |
50 | | - |
51 | | - |
52 | | -**Génération d'otp**<br> |
53 | | - |
54 | | -POST /api/notifications/otp/generate <br> |
55 | | - |
56 | | -**Body json**<br> |
57 | | - |
58 | | --Envoi par numéro de téléphone<br> |
59 | | -{<br> |
60 | | - "utilisateurId": "+22350087965",<br> |
61 | | - "canalNotification": "SMS"<br> |
62 | | -}<br> |
63 | | --Envoi par email<br> |
64 | | -{<br> |
65 | | - "utilisateurId": "youremail@gmail.com",<br> |
66 | | - "canalNotification": "EMAIL"<br> |
67 | | -}<br> |
68 | | - |
69 | | -**Vérification d'un otp**<br> |
70 | | - |
71 | | -POST /api/notifications/otp/verify<br> |
72 | | -**BODY JSON**<br> |
73 | 23 |
|
| 24 | +## Fonctionnalités principales |
| 25 | + |
| 26 | +- Génération et validation d’OTP avec expiration automatique. |
| 27 | +- Envoi de notifications personnalisées via des templates. |
| 28 | +- Intégration RabbitMQ : consommation d’événements de `wallet-service` (dépôt, retrait, transfert, OTP…) et transformation en notifications. |
| 29 | +- Validation stricte des payloads HTTP avec **Zod** (emails et téléphones obligatoires, structure `transfer` dédiée, etc.). |
| 30 | + |
| 31 | +--- |
| 32 | + |
| 33 | +## Endpoints HTTP |
| 34 | + |
| 35 | +Tous les endpoints HTTP exposés par ce service sont préfixés par : |
| 36 | + |
| 37 | +- `/api/notifications` |
| 38 | + |
| 39 | +### 1. Envoi d’une notification (HTTP direct) |
| 40 | + |
| 41 | +`POST /api/notifications/envoyer` |
| 42 | + |
| 43 | +Depuis la refonte, le service est **strictement dépendant des coordonnées fournies dans le JSON**. Deux formes sont possibles : |
| 44 | + |
| 45 | +#### a) Notification de transfert |
| 46 | + |
| 47 | +```json |
74 | 48 | { |
75 | | - "utilisateurId": "+22350087965",<br> |
76 | | - "code": "1234"<br> |
| 49 | + "type": "transfer", |
| 50 | + "sender": { |
| 51 | + "email": "expediteur@mail.com", |
| 52 | + "phone": "+22300000000" |
| 53 | + }, |
| 54 | + "receiver": { |
| 55 | + "email": "destinataire@mail.com", |
| 56 | + "phone": "+22311111111" |
| 57 | + }, |
| 58 | + "amount": 5000, |
| 59 | + "content": "Transfert de 5000 FCFA réussi." |
77 | 60 | } |
78 | | -**Réponse**<br> |
79 | | -{<br> |
80 | | - "success": true,<br> |
81 | | - "message": "OTP validé"<br> |
| 61 | +``` |
| 62 | + |
| 63 | +- Le schéma Zod impose : |
| 64 | + - `type` = `"transfer"`. |
| 65 | + - `sender.email` / `sender.phone` obligatoires. |
| 66 | + - `receiver.email` / `receiver.phone` obligatoires. |
| 67 | + - `amount > 0`. |
| 68 | + - `content` non vide. |
| 69 | +- Le service crée **deux paires de notifications** (SMS + EMAIL) : |
| 70 | + - Pour l’expéditeur (role = `SENDER`). |
| 71 | + - Pour le destinataire (role = `RECEIVER`). |
| 72 | +- Les messages sont envoyés : |
| 73 | + - par SMS via Twilio sur `phone`. |
| 74 | + - par email via `mailService.sendEmail` sur `email`. |
| 75 | +- Le `context` des entités `Notification` contient notamment `montant` et `role`. |
| 76 | + |
| 77 | +#### b) Notification simple (autres types) |
| 78 | + |
| 79 | +```json |
| 80 | +{ |
| 81 | + "type": "ALERT_SECURITE", |
| 82 | + "user": { |
| 83 | + "email": "client@mail.com", |
| 84 | + "phone": "+22322222222" |
| 85 | + }, |
| 86 | + "content": "Connexion suspecte détectée." |
82 | 87 | } |
| 88 | +``` |
83 | 89 |
|
84 | | -**Autres réponses possibles**<br> |
| 90 | +- `type` peut être l’une des valeurs de `TypeNotification` (sauf `"transfer"` qui utilise le schéma dédié). |
| 91 | +- `user.email` et `user.phone` sont obligatoires. |
| 92 | +- Le service envoie systématiquement la notification **à la fois par SMS et par email**. |
85 | 93 |
|
86 | | -{ "success": false, "message": "Code invalide" }<br> |
87 | | -{ "success": false, "message": "Code expiré" }<br> |
88 | | -{ "success": false, "message": "Ce code a déjà été utilisé" }<br> |
| 94 | +En cas de JSON invalide (champ manquant / mauvais type), le contrôleur renvoie : |
89 | 95 |
|
90 | | ---- |
91 | | -## Structure du projet |
| 96 | +```json |
| 97 | +{ |
| 98 | + "success": false, |
| 99 | + "message": "Corps de requête invalide", |
| 100 | + "errors": { ...détail Zod... } |
| 101 | +} |
| 102 | +``` |
92 | 103 |
|
| 104 | +### 2. Génération d’OTP |
93 | 105 |
|
94 | | -```bash |
95 | | -notification-service/ |
96 | | -│ |
97 | | -├── src/ |
98 | | -│ ├── controllers/ |
99 | | -│ │ ├── notificationController.ts # Gère les requêtes liées à l’envoi de notifications |
100 | | -│ │ ├── otpController.ts # Gère la génération et la vérification des OTP |
101 | | -│ │ |
102 | | -│ ├── entities/ |
103 | | -│ │ ├── Notification.ts # Modèle de données pour les notifications |
104 | | -│ │ ├── Otp.ts # Modèle de données pour les OTP (code, expiration, utilisateur) |
105 | | -│ │ |
106 | | -│ ├── routes/ |
107 | | -│ │ ├── notificationRoutes.ts # Définition des routes Express pour les notifications et OTP |
108 | | -│ │ |
109 | | -│ ├── services/ |
110 | | -│ │ ├── notificationService.ts # Logique métier liée aux notifications |
111 | | -│ │ ├── otpService.ts # Logique métier liée aux OTP |
112 | | -│ │ |
113 | | -│ ├── utils/ |
114 | | -│ │ ├── mailService.ts # Gère l’envoi des e-mails (transporteur, configuration…) |
115 | | -│ │ ├── messageTemplates.ts # Contient les templates des messages |
116 | | -│ │ |
117 | | -│ ├── app.ts # Configuration principale de l’application Express |
118 | | -│ ├── data-source.ts # Configuration et connexion à la base de données |
119 | | -│ ├── index.ts # Point d’entrée pour la déclaration des routes |
120 | | -│ ├── server.ts # Lancement du serveur Express |
121 | | -│ |
122 | | -├── .env # Variables d’environnement (PORT, DB_URL, etc.) |
123 | | -├── package.json # Dépendances et scripts du projet |
124 | | -├── tsconfig.json # Configuration TypeScript |
| 106 | +`POST /api/notifications/otp/generate` |
| 107 | + |
| 108 | +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. |
125 | 109 |
|
| 110 | +```json |
| 111 | +{ |
| 112 | + "utilisateurId": "user-otp-1", |
| 113 | + "canalNotification": "SMS", |
| 114 | + "email": "userotp@mail.com", |
| 115 | + "phone": "+22300000000" |
| 116 | +} |
| 117 | +``` |
| 118 | + |
| 119 | +- `utilisateurId`: identifiant métier (user id). |
| 120 | +- `canalNotification`: `"SMS"` ou `"EMAIL"`. |
| 121 | +- `email`: email du destinataire (obligatoire). |
| 122 | +- `phone`: numéro du destinataire (obligatoire). |
| 123 | + |
| 124 | +│ │ ├── Notification.ts # Modèle de données pour les notifications |
| 125 | + |
| 126 | +L’événement publié (contrat inter-services) contient : |
| 127 | + |
| 128 | +```json |
| 129 | +{ |
| 130 | + "utilisateurId": "user-otp-1", |
| 131 | + "typeNotification": "VERIFICATION_TELEPHONE", |
| 132 | + "canal": "SMS", |
| 133 | + "context": { "code": "1234" }, |
| 134 | + "email": "userotp@mail.com", |
| 135 | + "phone": "+22300000000", |
| 136 | + "metadata": { |
| 137 | + "service": "notification-service:otp", |
| 138 | + "correlationId": "otp-<id>" |
| 139 | + } |
| 140 | +} |
| 141 | +``` |
| 142 | + |
| 143 | +Les templates de message utilisent ce `context` pour produire des textes explicites, par exemple : |
| 144 | + |
| 145 | +- `VERIFICATION_TELEPHONE` : |
| 146 | + > « Votre code OTP de vérification téléphone est : {code}. Ce code est valable 5 minutes. Ne le partagez jamais avec un tiers. » |
126 | 147 |
|
| 148 | +### 3. Vérification d’un OTP |
127 | 149 |
|
| 150 | +`POST /api/notifications/otp/verify` |
| 151 | + |
| 152 | +Body JSON : |
| 153 | + |
| 154 | +```json |
| 155 | +{ |
| 156 | + "utilisateurId": "user-otp-1", |
| 157 | + "code": "1234" |
| 158 | +} |
| 159 | +``` |
| 160 | + |
| 161 | +Réponses possibles : |
| 162 | + |
| 163 | +```json |
| 164 | +{ "success": true, "message": "OTP validé" } |
| 165 | +{ "success": false, "message": "Code invalide" } |
| 166 | +{ "success": false, "message": "Code expiré" } |
| 167 | +{ "success": false, "message": "Ce code a déjà été utilisé" } |
| 168 | +``` |
| 169 | + |
| 170 | +--- |
| 171 | + |
| 172 | +│ │ ├── Otp.ts # Modèle de données pour les OTP (code, expiration, utilisateur) |
| 173 | +│ │ |
| 174 | +│ ├── routes/ |
| 175 | +│ │ ├── notificationRoutes.ts # Définition des routes Express pour les notifications et OTP |
| 176 | +│ │ |
| 177 | +│ ├── services/ |
| 178 | +│ │ ├── notificationService.ts # Logique métier liée aux notifications |
| 179 | +│ │ ├── otpService.ts # Logique métier liée aux OTP |
| 180 | +│ │ |
| 181 | +│ ├── utils/ |
| 182 | +│ │ ├── mailService.ts # Gère l’envoi des e-mails (transporteur, configuration…) |
| 183 | +│ │ ├── messageTemplates.ts # Contient les templates des messages |
| 184 | +│ │ |
| 185 | +│ ├── app.ts # Configuration principale de l’application Express |
| 186 | +│ ├── data-source.ts # Configuration et connexion à la base de données |
| 187 | +│ ├── index.ts # Point d’entrée pour la déclaration des routes |
| 188 | +│ ├── server.ts # Lancement du serveur Express |
| 189 | +│ |
| 190 | +├── .env # Variables d’environnement (PORT, DB_URL, etc.) |
| 191 | +├── package.json # Dépendances et scripts du projet |
| 192 | +├── tsconfig.json # Configuration TypeScript |
0 commit comments