Impostazioni e Audit (SuperAdmin)
La dashboard del tenant espone un'area impostazioni operatore in
/dashboard/amministrazione/settings/*, protetta da IsSuperAdminGuard. Ogni pagina è
supportata da un controller autenticato tramite cookie; gli endpoint sensibili riverificano
il ruolo SuperAdmin lato server. L'editor JSON grezzo della configurazione si trova in
/dashboard/amministrazione/configurazione-tecnica ed è deliberatamente escluso
dalle superfici di navigazione.
Feature flag
| Pagina | /dashboard/amministrazione/settings/feature-flags |
| API | GET/POST /api/v1/admin/feature-flags |
| Accesso | Lettura anonima (bootstrap del login); il salvataggio richiede Admin |
La pagina carica l'intera lista dei flag e la salva in blocco — ogni interruttore della pagina
viene inviato in un'unica richiesta. I flag protetti (chiavi _system_* e
enable_subscriptions una volta consolidato il marcatore di cutover delle sottoscrizioni) vengono
ignorati silenziosamente quando il valore è invariato e rifiutati con
errors.general.permissionDenied quando si tenta una modifica reale, così un batch non correlato
non blocca mai la pagina.
I feature flag sono entità sottoposte ad audit (FeatureFlag : BaseAuditEntity), quindi ogni
modifica di valore è registrata nella pista di audit con attore e marche temporali. Vedi
Feature Flag per l'elenco e la semantica dei flag.
Token API
| Pagina | /dashboard/amministrazione/settings/token-api |
| API | /api/v1/api-tokens |
| Accesso | Solo SuperAdmin |
- Crea un token con un nome, uno o più permessi (scope), origini
consentite (separate da virgole;
*disabilita il pinning dell'origine) e unexpiresAtopzionale. - Il token in chiaro è mostrato una sola volta, alla creazione. Il database conserva solo un
hash SHA-256 più un prefisso di 8 caratteri (
TokenPrefix) usato per l'identificazione. - L'applicazione dell'origine è rigorosa: un token senza
AllowedOriginsviene rifiutato, e una richiesta la cuiOriginnon è in lista viene respinta anche se il token è valido. - La modifica aggiorna nome/permessi/origini/scadenza/stato attivo; la revoca elimina il
record del token.
lastUsedAtedexpiresAtsono visibili nella tabella.
I token di API pubblica lato tenant (lettore blog nativo, sitemap, integrazioni) si
gestiscono da CLI con flo instance api-token ls|create|grant|revoke <id>.
Webhook
| Pagina | /dashboard/amministrazione/settings/webhook |
| API | /api/v1/webhook-configs |
| Accesso | Solo SuperAdmin |
I webhook attivano flussi esterni (GitHub Actions / pipeline GitLab) quando cambiano le entità dinamiche:
- Provider: GitHub, GitLab o Generic;
Repository,WorkflowFileeBranchdi destinazione. - Eventi:
create,update,delete,publishseparati da virgole; una lista vuota si attiva su ogni evento. È possibile allegareInputsJsonaggiuntivi per il workflow. - Token di autenticazione: cifrato a riposo con ASP.NET Data Protection
(
Flo.Webhook.AuthToken.v1); mai restituito in chiaro. - Log di consegna: ogni configurazione traccia
LastTriggeredAt,LastTriggerStatus,LastTriggerErroreTriggerCount.POST /{id}/triggerePOST /{id}/testeseguono una consegna manuale dalla UI (solo SuperAdmin).
Origini CORS
| Pagina | /dashboard/amministrazione/settings/origini-cors |
| API | /api/v1/cors-origins |
| Accesso | Solo SuperAdmin |
Le origini sono memorizzate nel database e applicate dalla policy CORS dinamica del backend
invece della configurazione statica. Gli operatori possono creare, aggiornare ed eliminare
le origini; ogni voce ha un flag attivo e una descrizione. GET /active restituisce la
lista effettiva e POST /initialize inizializza le origini di sviluppo locale predefinite
(localhost:4200, 4201, 8080, 10001, 10002). Le origini frontend per i tenant
Cloudflare Pages vengono normalmente inserite automaticamente al momento del provisioning.
Pista di audit
| Pagina | /dashboard/amministrazione/settings/audit-trail |
| API | /api/v1/audit-logs |
| Accesso | Lettura: Admin+ (indirizzi IP: solo SuperAdmin) |
- Solo accodamento:
ApplicationDbContextrifiuta aggiornamenti ed eliminazioni delle righeAuditLog; solo i percorsi di manutenzione diAuditLogServicepossono modificarle. - Cattura automatica: le modifiche alle entità sono accodate nella stessa transazione della
modifica stessa, con attore, azione (
Created/Modified/Deleted), nome/ID entità, valori vecchi/nuovi e marca temporale.AuditLogstesso non è mai sottoposto ad audit e le scritture esclusivamente di macchina sono escluse. - Conservazione: predefinita 730 giorni, configurabile da 30 a 3650 tramite
GET/PUT /retention.DELETE /purge?retentionDays=rimuove le voci più vecchie (minimo 30). - Cronologia entità:
GET /entity/{entityName}/{entityId}restituisce la cronologia completa delle modifiche di un record; la UI espande ogni riga per mostrare il JSON vecchio/nuovo. - Esportazioni:
GET /export-queryscarica la query filtrata come JSON (limite di 50.000 voci);GET /export/user/{userId}è l'esportazione GDPR Articolo 15 (solo SuperAdmin). - Lapidi (tombstone): l'anonimizzazione GDPR (
POST /anonymize/user/{userId}, Articolo 17) e le eliminazioni accodano una lapide di audit che registra l'azione di manutenzione, il conteggio e i dettagli, così il log resta auto-descrittivo dopo la redazione dei dati. - Catena di salt: l'hashing di anonimizzazione usa
AUDIT_HASH_SALTS(catena separata da virgole, l'ultimo salt è quello corrente) conAuditLog:HashSaltcome fallback; la rotazione dei segreti da CLI accoda nuovi salt senza invalidare gli hash precedenti.
Eventi di autenticazione (accessi falliti)
| Pagina | /dashboard/amministrazione/settings/accessi-errori |
| API | /api/v1/auth-events |
| Accesso | Solo SuperAdmin |
Registra i fallimenti del login social da due sorgenti: server (scambi Google/Apple
rifiutati) e client (la pagina di login segnala i fallimenti lato browser — popup
bloccato, adblock — tramite un POST /client anonimo fire-and-forget). L'endpoint GET
filtra per metodo (google/apple), motivo, sorgente e intervallo di date, e
restituisce pagine da 50 voci. Le segnalazioni client accettano solo motivi in allow-list e
non si fidano mai di IP/user-agent forniti nel body.
Provider di login
| Pagina | /dashboard/amministrazione/settings/provider-accesso |
| API | /api/v1/external-auth-settings |
| Accesso | Solo SuperAdmin |
Memorizza i Client ID Google e Apple usati dal login social. Nessun client secret è conservato nel database del tenant — solo gli identificatori pubblici, con upsert per provider.
Template email
| Pagina | /dashboard/amministrazione/settings/template-email |
| API | GET /api/v1/newsletter/templates/* |
| Accesso | SuperAdmin (permesso di notifiche operative per la lista) |
Elenca i template email transazionali noti al renderer con nome base, lingua e variabili segnaposto, e rende un'anteprima HTML live per qualsiasi template. I template risiedono su disco nell'immagine applicativa; la pagina è una superficie di ispezione in sola lettura. Vedi Configurazione Email per provider e mittenti.
Log di consegna email
| Pagina | /dashboard/amministrazione/settings/log-consegna-email |
| API | /api/v1/email-delivery-logs |
| Accesso | Solo SuperAdmin |
Un'unica griglia su tutti i provider email, che unisce il log di consegna locale (scritto
da ogni percorso di invio) con le analytics live dei provider. Filtri: intervallo date, stato,
provider, destinatario, ID job di invio e canale; paginazione a 25 righe.
GET /availability guida la visibilità della scheda Impostazioni ed è sempre abilitato.
Editor di configurazione
| Pagina | /dashboard/amministrazione/configurazione-tecnica |
| API | /api/v1/config-editor |
| Accesso | Solo SuperAdmin |
Modifica JSON grezza per tre file: theme (flo.theme.json), brand-config
(flo.configs.json) e whitelabel (<env>.config.json). Il servizio valida
il JSON prima di scrivere, crea un backup .bak.<yyyyMMddHHmmss> con marca temporale prima
di ogni salvataggio e conserva i 5 backup più recenti. Le chiavi file sono in allow-list e
il path traversal è rifiutato. Tutte le letture e scritture sono protette da lease: su uno standby DR
la pagina è in sola lettura (vedi Failover e Disaster Recovery).
Log applicativi
| Pagina | /dashboard/amministrazione/settings/log |
| API | /api/v1/logs |
| Accesso | Solo SuperAdmin |
Visualizzatore dei log lato server sui file Serilog rotanti dell'applicazione:
- Periodi:
24h,48h,72h,1w(predefinito),1m,all. - Filtri: livelli di log (
VRB,DBG,INF,WRN,ERR,FTL), ricerca a testo libero, percorso della richiesta e contesto sorgente; dal più recente con paginazione (max 5.000 righe per query). - Vista per utente:
GET /user/{userId}. - Esportazioni: CSV (
/export/csv) e JSON (/export/json). GET /diagnosticriporta dove risiedono i file di log sul filesystem del container.
Per i log a livello container (blue/green/Traefik/Postgres) usa la CLI:
flo logs app|db|proxy|errors|days|day|raw <id>.