Skip to content

Service System

simone.tiberti edited this page Apr 23, 2026 · 3 revisions

SystemService

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.


Bootstrap

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 è:

  1. GET {environmentUrl} → popola environment
  2. GET {tokenUrl} (con header AppId: {appId}) → popola whoami, paths, apps, sites
  3. menuTree è un computed derivato da paths — si aggiorna automaticamente

Deduplicazione e failure

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'.


Segnali esposti

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

Metodi

canDo(action)

Verifica se l'utente ha una specifica capability:

const puoEliminare = this.system.canDo('delete');

getEnvironmentProperty(key)

const apiBase = this.system.getEnvironmentProperty('apiBaseUrl') as string;

normalizePath(path)

Normalizza un path (rimuove trailing slash, aggiunge leading slash).


Uso nei componenti

@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>
}

Vedi anche

Clone this wiki locally