Entités Utilisateurs
User
Table : users
Description : Représente un utilisateur du hub SSO (modèle Prisma, schema.prisma)
| Champ | Type | Description |
|---|---|---|
emailOptIn |
boolean? |
Consentement à recevoir la newsletter par email. null = jamais renseigné (pas de valeur par défaut en base), true/false = choix explicite de l'utilisateur. |
(Documentation en cours de construction — seul le champ emailOptIn est couvert pour l'instant. Les autres champs du modèle User seront ajoutés progressivement.)
emailOptIn — fonctionnement
Ce champ est la source de vérité du consentement newsletter pour toutes les plateformes (A1Connect, Dema1n, Inspire-v2, JobReady). Il est mis à jour et propagé à plusieurs endroits :
- Mise à jour par Brevo (l'outil d'envoi de newsletter) via deux webhooks entrants :
POST /webhook/brevo/subscribe→ metemailOptIn = true(webhook.service.ts:14-35)POST /webhook/brevo/unsubscribe→ metemailOptIn = false(webhook.service.ts:37-58)- Propagation aux autres plateformes : à chaque changement déclenché par un de ces deux webhooks, A1Connect publie un événement RabbitMQ
USER_UPDATED(routing keyuser___updated, exchangea1connect) contenant{ id, email, emailOptIn }— voir_notifyUserUpdated, webhook.service.ts:129-163. C'est cet événement que chaque plateforme consomme pour mettre à jour son propre champ équivalent (newslettercôté Dema1n et Inspire-v2). Voirrabbitmq.md. - Réception d'un changement venant d'une autre plateforme : quand une autre plateforme modifie
emailOptInet republie unUSER_UPDATED, A1Connect l'applique aussi dans l'autre sens : - persistance en base (
events.service.ts:56-96,updateUser) - puis synchronisation de la liste de désabonnement Brevo (
emailBlacklisted = !emailOptIn) via_updateBrevoUserBlackList, events.service.ts:150-168 - Pas de date de dernière modification : contrairement à Inspire-v2 (champ
update_newsletter, lui-même non utilisé actuellement côté applicatif), A1Connect n'a pas de champ dédié pour dater le dernier changement deemailOptIn.
Aucun autre champ du modèle User n'est directement lié à emailOptIn en base (pas de champ de consentement séparé, de date, ou de statut de blacklist stocké localement — le statut blacklist vit uniquement côté Brevo).