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_userfrom 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
| Canal | Quand |
|---|---|
| La boîte de réception dans l’interface | tout de suite, dans votre transaction |
Un coup de sonnette en direct (WebSocket) sur user:42 | aprè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 luesUne é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.