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).
Diagramă ER
Section titled “Diagramă ER”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).
Entități de bază (gnotify.jdl)
Section titled “Entități de bază (gnotify.jdl)”| Entitate | Rol | Câmpuri cheie |
|---|---|---|
| Sistem | sistem 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 |
| Notificare | o cerere notify (≙ log notification.created) | trackingId (unic), templateKey, limba, status, variabile (JSON); → sistem |
| Livrare | o livrare per canal | canal, tier, destinatar, continutRandat (JSON), status, providerMessageId, eroare, incercari; → notificare |
| EvenimentNotificare | jurnal append-only | tip, canal, tier, actor, data, payload (JSON); → notificare |
Entități registru (aditive, @skipClient)
Section titled “Entități registru (aditive, @skipClient)”| Entitate | Slice | Rol |
|---|---|---|
| Destinatar | registry.jdl | persoană (IDNP)/entitate (IDNO); identificator unic, userLogin (self-service) |
| CanalContact | registry.jdl | o adresă concretă a unui destinatar (canal, valoare, principal, verificat); → destinatar |
| PreferintaNotificare | registry.jdl | canale preferate (CSV ordonat), systemId opțional (override per sistem); → destinatar |
| Grup | registry-groups.jdl | grup de destinatari deținut de un sistem; membri = CSV de identificatori |
| PushSubscription | registry-groups.jdl | abonare Web Push (VAPID) per dispozitiv: endpoint, p256dh, authKey |
| Provider | registry-providers.jdl | backend de livrare configurabil (SMTP/SNS/HTTP): cheie (unic), tip, config (JSON), activ |
Enumerări
Section titled “Enumerări”| Enum | Valori |
|---|---|
| Canal | EMAIL, PUSH, TELEGRAM, SMS |
| Tier | PRIORITY, IMPORTANT |
| StatutLivrare | QUEUED, SENT, FAILED |
| StatutNotificare | QUEUED, SENT, FAILED, PARTIAL |
| TipEvenimentNotif | CREATED, QUEUED, SENT, FAILED, MNOTIFY_SENT, MNOTIFY_FAILED |
| TipDestinatar | PF, PJ |
| TipProvider | EMAIL_SMTP, SMS_SNS, SMS_HTTP |
Statutul agregat (StatutNotificare)
Section titled “Statutul agregat (StatutNotificare)”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/configsunt@Lobtext cu JSON (gNotify nu interoghează în interior). Conversia lajsonbfizic 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ă oricejhipster jdl(vezi MNotify-Forwarding).