Aller au contenu

Prévenir un utilisateur

Votre module a quelque chose à dire à quelqu’un : un emprunt est en retard, une facture est payée. Vous écrivez une ligne, et le noyau s’occupe des canaux.

from kewos.notifications import notify_user
from kewos.notifications.user_inbox import NotificationKind
with engine.begin() as conn:
... # votre écriture métier
notify_user(
conn,
user_id=42,
kind=NotificationKind.STATE_CHANGE,
payload={"model": "library_loan", "record_id": 19, "state": "overdue"},
)

C’est l’interdiction n°31 : aucun module n’émet une notification autrement. Pas de courriel bricolé, pas de table maison, pas d’appel direct à un service de push.

Ce que fait cette ligne

CanalQuand
La boîte de réception dans l’interfacetout de suite, dans votre transaction
Un coup de sonnette en direct (WebSocket) sur user:42après le commit
Une notification sur téléphone (Web Push chiffrée)après le commit, si l’utilisateur l’a acceptée et que le serveur a ses clés

Vous n’avez déclaré aucun de ces canaux. Un utilisateur sans navigateur ouvert et sans push retrouve la notification dans sa boîte à sa prochaine connexion : le canal est un confort, la boîte est la vérité.

La propriété qui compte : une transaction annulée ne prévient personne

notify_user prend votre connexion, pas le moteur. L’insertion rejoint donc votre transaction. Exécuté :

après une transaction ANNULÉE : 1 non lue (inchangé)
après une transaction RÉUSSIE : 2 non lues

Une écriture métier qui échoue dé-notifie l’utilisateur, parce que la notification n’a jamais existé. C’est la même posture que la file de courriels (interdiction n°17) : on ne prévient pas d’un fait qui n’a pas eu lieu.

Et les deux canaux externes se déclenchent sur l’événement commit, pas en ligne :

  • le coup de sonnette dit seulement « relis ta boîte », sans contenu. Une course perdue ou une transaction annulée ne produit donc qu’une relecture vide, jamais une fausse information affichée ;
  • le push part après le commit, avec une charge minimale (titre, corps, URL) parce qu’il transite par un service tiers. Il est chiffré de bout en bout avant de partir : le service de push ne lit rien.

Quatre genres, et pourquoi c’est fermé

MENTION, COMMENT, STATE_CHANGE, SYSTEM. La liste est courte exprès : le genre pilote le rendu, le regroupement et le résumé par courriel. Un genre par module rendrait la boîte de réception illisible et le résumé impossible à écrire.

Le payload est libre et le vôtre : le noyau ne le lit pas, il le rend.