Sari la conținut

ADR-003 — Jurnal de audit append-only (`RegistryAudit`)

Acest conținut nu este încă disponibil în limba selectată.

  • Status: Acceptat
  • Data: 2026-07-07
  • Componentă: RegistryAudit, strat de servicii, DB
  • Decidenți: Arhitect platformă GStack, teamlead

RSI este o sursă de adevăr guvernamentală: cine a înregistrat un sistem, cine l-a publicat pe GPortal, cine a schimbat o dependență sau a marcat un mediu ca indisponibil — toate trebuie să fie trasabile și inalterabile. JDL-ul definește RegistryAudit (changeType, actor, summaryRo/En, ipAddress, occurredAt) și notează explicit: „append-only din perspectiva aplicației (enforce no-update/no-delete în stratul de servicii)”.

RegistryAudit este strict append-only. Se garantează pe două niveluri:

  1. Strat de servicii — RegistryAuditService expune doar create/citiri. Nu există metode de update/delete; repository-ul nu expune save pentru modificare a rândurilor existente și nici delete*.
  2. Bază de date — un trigger PostgreSQL (BEFORE UPDATE OR DELETE ON registry_audit) ridică excepție, ca dublă plasă de siguranță împotriva scrierilor directe. Se adaugă printr-un changelog Liquibase separat (changelog-urile sunt append-only, nu se editează cele comise).

Fiecare tranziție cu impact din registru (creare/editare sistem, schimbare de statut, publicare/depublicare, schimbare de dependență, schimbare de mediu, ștergere) scrie un rând de audit cu ChangeType corespunzător. Jurnalul se redirecționează și către GLog pentru logging centralizat, dar copia locală în RSI rămâne autoritară.

  1. Doar la nivel de aplicație. Respins: o scriere directă în DB (migrare, script) ar putea altera istoricul fără urmă.
  2. Event sourcing complet (toate entitățile ca stream de evenimente). Respins: supra-dimensionat pentru un catalog; RegistryAudit + coloanele de audit standard (AbstractAuditingEntity) acoperă cerința.
  3. Doar delegare către GLog. Respins: RSI trebuie să rămână autoritar și interogabil chiar dacă GLog e indisponibil.

Pozitive

  • Istoric inalterabil, conform cerințelor de trasabilitate guvernamentală.
  • Dublă apărare (serviciu + trigger) rezistă și la scrieri directe.

Negative / riscuri

  • Fără UPDATE/DELETE ⇒ corecțiile se fac prin rânduri noi (compensatoare), nu prin editare.
  • Creștere monotonă a tabelei ⇒ necesită politică de retenție/arhivare (decizie deschisă, vezi ../db_schema.md §8).
  • Model: ../../GRegistry.jdl (RegistryAudit)
  • Schema + trigger: ../db_schema.md §5
  • Design: ../platform_design.md §4 (fiecare tranziție scrie un audit)