ADR 003 Audit
Acest conținut nu este încă disponibil în limba selectată.
ADR-003 — Jurnal de audit append-only (RegistryAudit)
Section titled “ADR-003 — Jurnal de audit append-only (RegistryAudit)”- Status: Acceptat
- Data: 2026-07-07
- Componentă:
RegistryAudit, strat de servicii, DB - Decidenți: Arhitect platformă GStack, teamlead
Context
Section titled “Context”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)”.
Decizie
Section titled “Decizie”RegistryAudit este strict append-only. Se garantează pe două niveluri:
- Strat de servicii —
RegistryAuditServiceexpune doarcreate/citiri. Nu există metode de update/delete; repository-ul nu expunesavepentru modificare a rândurilor existente și nicidelete*. - 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ă.
Alternative considerate
Section titled “Alternative considerate”- Doar la nivel de aplicație. Respins: o scriere directă în DB (migrare, script) ar putea altera istoricul fără urmă.
- 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. - Doar delegare către GLog. Respins: RSI trebuie să rămână autoritar și interogabil chiar dacă GLog e indisponibil.
Consecințe
Section titled “Consecințe”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).
Legături
Section titled “Legături”- Model:
../../GRegistry.jdl(RegistryAudit) - Schema + trigger:
../db_schema.md §5 - Design:
../platform_design.md §4(fiecare tranziție scrie un audit)