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 → met emailOptIn = true (webhook.service.ts:14-35)
  • POST /webhook/brevo/unsubscribe → met emailOptIn = 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 key user___updated, exchange a1connect) 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 (newsletter côté Dema1n et Inspire-v2). Voir rabbitmq.md.
  • Réception d'un changement venant d'une autre plateforme : quand une autre plateforme modifie emailOptIn et republie un USER_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 de emailOptIn.

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).