ADR-004 — Flux de publicare pe GPortal cu aprobare (`PublicationRequest`)
- Status: Acceptat
- Data: 2026-07-07
- Componentă:
PublicationRequest,InformationSystem.publishedToPortal, strat de servicii - Decidenți: Arhitect platformă GStack, teamlead
Context
Section titled “Context”Nu orice sistem din RSI trebuie să apară pe GPortal (portalul public). Expunerea
publică este o decizie de guvernanță care necesită aprobare, nu un simplu toggle.
JDL-ul modelează asta prin PublicationRequest (stări
DRAFT / PROPOSED / APPROVED / PUBLISHED / REJECTED / UNPUBLISHED) și printr-un flag
denormalizat InformationSystem.publishedToPortal.
Decizie
Section titled “Decizie”Publicarea unui sistem pe GPortal trece obligatoriu printr-o mașină de stări cu poartă
de aprobare, guvernată de PublicationRequest:
DRAFT --propune--> PROPOSED --aprobă--> APPROVED --publică--> PUBLISHEDPROPOSED --respinge--> REJECTEDPUBLISHED --depublică--> UNPUBLISHEDREJECTED / UNPUBLISHED --> (nou) DRAFTReguli aplicate în stratul de servicii (nu în controller):
- Tranzițiile sunt validate de un state machine; tranzițiile ilegale sunt respinse.
- Doar sistemele cu
visibility = PUBLICpot ajunge înPUBLISHED. O cerere pentru un sistemINTERNAL/TESTeste blocată (regulă de business, testată negativ). - La
PUBLISHED⇒InformationSystem.publishedToPortal = true; laUNPUBLISHED⇒false. Flag-ul denormalizat este întreținut exclusiv de acest serviciu (sursa de decizie rămânePublicationRequest). - Fiecare tranziție scrie un rând
RegistryAuditcuChangeType(PUBLISH/UNPUBLISH/STATUS_CHANGE), conform ADR-003.
GPortal și ceilalți consumatori citesc doar sistemele PUBLIC și publishedToPortal=true
(vezi ADR-006).
Alternative considerate
Section titled “Alternative considerate”- Flag boolean simplu pe
InformationSystem, fără workflow. Respins: fără aprobare, fără istoric, fără separarea rolurilor propunător/aprobator. - Workflow extern (motor BPM). Respins ca supra-dimensionat pentru 6 stări; state machine în serviciu e suficient și testabil.
- Doar
visibilitycontrolează expunerea, fărăPublicationRequest. Respins: vizibilitatea e o proprietate a sistemului, publicarea e un act de guvernanță separat.
Consecințe
Section titled “Consecințe”Pozitive
- Separarea clară a rolurilor (propune vs. aprobă) și istoric complet al deciziilor.
- Invariant clar pentru consumatori: „public pe Portal ⇔ PUBLIC ∧ publishedToPortal”.
Negative / riscuri
- Flag denormalizat ⇒ risc de divergență dacă e scris din altă parte; se mitighează prin
centralizarea în
PublicationRequestService+ test de invariant.