Skip to content

Model de date

Sursa de adevăr: gnotify.jdl (5 entități de bază) + slice-uri aditive, generate țintit cu @skipClient (backend-only, ca să nu regenereze nucleul): registry.jdl (Destinatar/CanalContact/PreferintaNotificare), registry-groups.jdl (Grup/PushSubscription), registry-providers.jdl (Provider).

erDiagram
SISTEM ||--o{ TEMPLATE : "are"
SISTEM ||--o{ NOTIFICARE : "emite"
NOTIFICARE ||--o{ LIVRARE : "per canal"
NOTIFICARE ||--o{ EVENIMENTNOTIFICARE : "jurnal (append-only)"
DESTINATAR ||--o{ CANALCONTACT : "contacte"
DESTINATAR ||--o{ PREFERINTANOTIFICARE : "preferințe"

Entitățile registrului decuplate — Grup, PushSubscription, PreferintaNotificare.systemId, Provider — referă identificator (IDNP/IDNO) sau systemId ca string, NU prin FK (intenționat, ca să rămână decuplate și generabile țintit).

EntitateRolCâmpuri cheie
Sistemsistem extern înregistrat (≙ config.json)systemId (unic), denumire, certFingerprint (SHA-1), allowedChannels, activ, mnotifyEnabled
Templateșablon per (sistem, cheie, limbă) (unic compus)cheie, limba, continut (JSON per canal); → sistem
Notificareo cerere notify (≙ log notification.created)trackingId (unic), templateKey, limba, status, variabile (JSON); → sistem
Livrareo livrare per canalcanal, tier, destinatar, continutRandat (JSON), status, providerMessageId, eroare, incercari; → notificare
EvenimentNotificarejurnal append-onlytip, canal, tier, actor, data, payload (JSON); → notificare

Entități registru (aditive, @skipClient)

Section titled “Entități registru (aditive, @skipClient)”
EntitateSliceRol
Destinatarregistry.jdlpersoană (IDNP)/entitate (IDNO); identificator unic, userLogin (self-service)
CanalContactregistry.jdlo adresă concretă a unui destinatar (canal, valoare, principal, verificat); → destinatar
PreferintaNotificareregistry.jdlcanale preferate (CSV ordonat), systemId opțional (override per sistem); → destinatar
Grupregistry-groups.jdlgrup de destinatari deținut de un sistem; membri = CSV de identificatori
PushSubscriptionregistry-groups.jdlabonare Web Push (VAPID) per dispozitiv: endpoint, p256dh, authKey
Providerregistry-providers.jdlbackend de livrare configurabil (SMTP/SNS/HTTP): cheie (unic), tip, config (JSON), activ
EnumValori
CanalEMAIL, PUSH, TELEGRAM, SMS
TierPRIORITY, IMPORTANT
StatutLivrareQUEUED, SENT, FAILED
StatutNotificareQUEUED, SENT, FAILED, PARTIAL
TipEvenimentNotifCREATED, QUEUED, SENT, FAILED, MNOTIFY_SENT, MNOTIFY_FAILED
TipDestinatarPF, PJ
TipProviderEMAIL_SMTP, SMS_SNS, SMS_HTTP

Recalculat la fiecare schimbare de livrare (≙ NotificationLogReader::aggregate din PHP):

  • SENT — toate livrările SENT
  • FAILED — toate livrările FAILED
  • PARTIAL — toate terminale, dar amestec (SENT + FAILED)
  • QUEUED — altfel (cel puțin una încă în așteptare)
  • jsonb amânat: continut/variabile/continutRandat/payload/config sunt @Lob text cu JSON (gNotify nu interoghează în interior). Conversia la jsonb fizic e un pas de hardening documentat.
  • Unicitate compusă Template(sistem, cheie, limba) — changelog Liquibase dedicat (JDL nu suportă unique compus).
  • Sistem.mnotifyEnabled — adăugat prin changelog append-only; re-aplică pe enum/entitate după orice jhipster jdl (vezi MNotify-Forwarding).