-
Notifications
You must be signed in to change notification settings - Fork 0
Service System
Servizio singleton (providedIn: 'root') che gestisce il bootstrap dell'applicazione e mantiene lo stato globale tramite Angular signals. È il punto centrale di accesso alle informazioni sull'utente autenticato, sui permessi e sull'ambiente.
Il bootstrap parte automaticamente nel costruttore di SystemService, tramite queueMicrotask (differito di un tick per evitare la dipendenza circolare SystemService → HttpClient → contextInterceptor → SystemService).
I layout e le pagine non avviano il bootstrap — lo leggono già avviato tramite layoutState. Il MenuGuard lo attende con await system.bootstrap().
La sequenza è:
-
GET {environmentUrl}→ popolaenvironment -
GET {tokenUrl}(con headerAppId: {appId}) → popolawhoami,paths,apps,sites -
menuTreeè uncomputedderivato dapaths— si aggiorna automaticamente
Chiamate concorrenti riusano la stessa Promise (bootstrapPromise). In caso di errore, la promise rifiutata viene mantenuta in cache — nessun retry automatico. L'errore è visibile tramite layoutState() === 'error'.
| Signal | Tipo | Kind | Descrizione |
|---|---|---|---|
whoami |
{ user, roles, capabilities } | null |
signal | Utente autenticato |
paths |
PathNode[] | null |
signal | Tutti i path consentiti dal token |
menuTree |
PathNode[] | null |
computed | Nodi con menu: true, ordinati per order
|
apps |
App[] | null |
signal | Applicazioni disponibili nell'app-switcher |
sites |
Site[] | null |
signal | Siti disponibili |
environment |
Environment | null |
signal | Configurazione runtime |
environmentProperties |
Record<string, unknown> |
computed | Da environment().properties
|
layoutState |
'loading' | 'ready' | 'error' |
computed | Stato del ciclo di vita del bootstrap |
allowedEndpoints |
Set<string> |
computed | Endpoint normalizzati da paths
|
Verifica se l'utente ha una specifica capability:
const puoEliminare = this.system.canDo('delete');const apiBase = this.system.getEnvironmentProperty('apiBaseUrl') as string;Normalizza un path (rimuove trailing slash, aggiunge leading slash).
@Component({ ... })
export class MyComponent {
readonly system = inject(SystemService);
readonly utente = this.system.whoami;
readonly canCreate = computed(() => this.system.canDo('create'));
readonly apiBase = computed(() =>
this.system.getEnvironmentProperty('apiBaseUrl') as string
);
}<span>Benvenuto, {{ system.whoami()?.user }}</span>
@if (canCreate()) {
<button mat-flat-button (click)="nuovo()">Nuovo</button>
}- → Configurazione ambiente — struttura di
environment.json - → Routing e permessi —
MenuGuard, capability e rotte - → MenuGuard
Sviluppato e mantenuto da GPA — Gruppo Progetti Avanzati s.r.l. · gpa@gpagroup.it · +39 065913642 · P.IVA 05049391005 · ISO 9001 · ISO 27001
Sede legale: Via Ferdinando Galiani, 68 — 00191 Roma | Sedi operative: Piazzale Asia 21, Roma · Via Badoero 67, Roma · Viale Chiavellati 9, Foligno (PG)
npm · GitHub · Segnala un problema · Licenza MIT