Skip to content

Redirecționare MNotify

gNotify poate trimite o copie a fiecărei notificări livrate către platforma guvernamentală de notificări MNotify (interop.gov.md), prin TLS mutual. Best-effort, implicit în mod mock (formează și înregistrează payload-ul, dar nu transmite), complet auditabilă din ecranul Status notificare.

Certificatul este cel eIntegritate (ANI), nu misda.pfx al GLog. MNotify autentifică clientul cu certs/2026_e-integritate.pfx (alias test-integritate.ani.pki.gov.md). Certificatul e gitignored și copt în jar.

La DeliveryService.markSent(job), lângă apelul de audit GLog, se declanșează forward-ul:

markSent(job) -> mnotifyClient.forward(job) // @Async, best-effort, nu aruncă niciodată

forward(job) nu face nimic decât dacă toate: (1) gnotify.mnotify.enabled=true; (2) Sistem-ul e găsit după job.systemId(); (3) fie toggle-ul per-Sistem mnotifyEnabled e on, fie notificarea poartă hint-ul forwardMnotify.

Deci un sistem optează global (toggle pe pagina Sisteme) sau un producător optează per notificare (hint-ul forwardMnotify în corpul POST /api/admin/notify). Oricare e suficient.

buildPayload(job) produce forma MnotifyCreateNotification:

{
"subject": { "ro": "…" },
"body": { "ro": "…" },
"bodyShort": { "ro": "…" }, // body trunchiat la 160 caractere
"recipients": [ { "value": "…", "type": "EMAIL" | "IDNP" } ]
}

Tipul destinatarului e dedus din job.destinatar(): pattern email → EMAIL, 13 cifre → IDNP, altfel EMAIL (MNotify validează server-side).

Fiecare încercare scrie un EvenimentNotificare append-only (actor="mnotify"):

TipSens
MNOTIFY_SENTredirecționat (sau, în mock, format și înregistrat)
MNOTIFY_FAILEDeșec de transport / HTTP

payload-ul evenimentului: { mode, endpoint, request, response?, error? }. MNotifyEventRecorder scrie rândul în propria tranzacție pe firul async. Mock înregistrează și el — cu nota „MOCK — payload NU a fost trimis către MNotify”, ideal pentru a verifica exact octeții înainte de go-live. Evenimentele apar în cronologia din Status notificare (caută după trackingId).

ProprietateImplicitSens
enabledtruecomutator general
modemockmock = doar formează+înregistrează; default = POST mTLS real
urlhttps://mnotify.staging.egov.md:8443URL de bază
endpoints.notifications/api/Notificationendpoint POST
keystore.pathcerts/2026_e-integritate.pfxidentitate client PKCS12
keystore.aliastest-integritate.ani.pki.gov.mdalias cheie

Transport: Apache HttpClient 5, self-signed acceptat (chain.length==1), NoopHostnameVerifier (cert staging nu se potrivește cu host-ul). mTLS construit doar când mode=default.

Setează GNOTIFY_MNOTIFY_MODE=default — construiește RestClient-ul mTLS real și începe să POST-eze; evenimentele MNOTIFY_SENT/FAILED poartă apoi răspunsul HTTP real. Toggle, hint, audit — neschimbate.

Deployat: backend-2.12.0 la https://gnotify.gstack.esempla.systems rulează în mock mode.

service/mnotify/{MNotifyProperties,MNotifyClientConfig,MNotifyClient,MNotifyEventRecorder} + plumbing-ul forwardMnotify în service/delivery/* și web/rest/AdminNotify*. Două lucruri ating artefacte generate și trebuie re-aplicate: valorile MNOTIFY_SENT/FAILED pe enum-ul TipEvenimentNotif și câmpul Sistem.mnotifyEnabled (changelog 20260813100000_add_sistem_mnotify_enabled.xml).