Skip to content

ADR 004 Workflow

ADR-004 — Flux de publicare pe GPortal cu aprobare (PublicationRequest)

Section titled “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

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.

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ă--> PUBLISHED
PROPOSED --respinge--> REJECTED
PUBLISHED --depublică--> UNPUBLISHED
REJECTED / UNPUBLISHED --> (nou) DRAFT

Reguli aplicate în stratul de servicii (nu în controller):

  1. Tranzițiile sunt validate de un state machine; tranzițiile ilegale sunt respinse.
  2. Doar sistemele cu visibility = PUBLIC pot ajunge în PUBLISHED. O cerere pentru un sistem INTERNAL/TEST este blocată (regulă de business, testată negativ).
  3. La PUBLISHED ⇒ InformationSystem.publishedToPortal = true; la UNPUBLISHED ⇒ false. Flag-ul denormalizat este întreținut exclusiv de acest serviciu (sursa de decizie rămâne PublicationRequest).
  4. Fiecare tranziție scrie un rând RegistryAudit cu ChangeType (PUBLISH / UNPUBLISH / STATUS_CHANGE), conform ADR-003.

GPortal și ceilalți consumatori citesc doar sistemele PUBLIC și publishedToPortal=true (vezi ADR-006).

  1. Flag boolean simplu pe InformationSystem, fără workflow. Respins: fără aprobare, fără istoric, fără separarea rolurilor propunător/aprobator.
  2. Workflow extern (motor BPM). Respins ca supra-dimensionat pentru 6 stări; state machine în serviciu e suficient și testabil.
  3. Doar visibility controlează expunerea, fără PublicationRequest. Respins: vizibilitatea e o proprietate a sistemului, publicarea e un act de guvernanță separat.

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.
  • Model: ../../GRegistry.jdl (PublicationRequest, PublicationState)
  • Design: ../platform_design.md §4 (state diagram) și §6 (secvența de aprobare)
  • Depinde de: ADR-003, ADR-006