Dopo il login si atterra sulla scelta della piattaforma
Chiesto da Adriano: si entra e si sceglie dove andare, anche quando la scelta e' una sola. Prima ogni ruolo saltava dritto nella sua sezione. Non basta cambiare landingFor: /piattaforme era riservato ai ruoli admin e piattaforme, quindi mandarci un cliente avrebbe prodotto un CICLO di redirect - il middleware nega la pagina, rimanda a landingFor, landingFor rimanda dove il middleware nega. L'indice diventa la casa comune (aperto a ogni ruolo), mentre Stress Index, che sta sotto lo stesso percorso, resta riservato: la sua regola viene prima, perche' vince la prima che combacia. L'indice mostra a ognuno solo le sezioni che puo' aprire, quindi la scelta non espone mai una porta chiusa. Un test nuovo presidia l'invariante che rende impossibile il ciclo: la destinazione di landingFor deve essere accessibile a TUTTI i ruoli. Verificato in produzione: il cliente demo atterra sulla scelta e vede la sola card Longevity, adriano vede Campus e Stress Index, e da li' il percorso prosegue fino al referto. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EndnceRA5WnA6rvA5iV9WL
This commit is contained in:
@@ -61,9 +61,15 @@ export function logout(db: Database.Database, token: string): void {
|
||||
// /api/admin: anche /campus, /piattaforme e /longevity) vive in isProtectedPath, più sotto:
|
||||
// qui arrivano solo utenti già autenticati su una di quelle rotte.
|
||||
const RULES: [RegExp, Role[]][] = [
|
||||
// Le due piattaforme storiche: il Biohacking Campus (contenuti) e Stress Index.
|
||||
// ⚠️ L'INDICE /piattaforme e' la casa comune: lo apre chiunque sia loggato, perche' e'
|
||||
// la pagina su cui si atterra dopo il login (deciso da Adriano il 03/09/2026). Mostra a
|
||||
// ognuno solo le sezioni che puo' aprire davvero — il filtro e' in data/piattaforme.
|
||||
// Stress Index sta SOTTO quel percorso ma resta riservato, quindi la sua regola viene
|
||||
// prima: vince la prima che combacia, e la piu' specifica deve poter parlare per prima.
|
||||
[/^\/piattaforme\/stress-index(\/|$)/, ['admin', 'piattaforme']],
|
||||
[/^\/piattaforme\/?$/, [...ROLES]],
|
||||
// Il Biohacking Campus (contenuti del corso).
|
||||
[/^\/campus(\/|$)/, ['admin', 'piattaforme']],
|
||||
[/^\/piattaforme(\/|$)/, ['admin', 'piattaforme']],
|
||||
// Longevity: il cliente vede solo il proprio spazio, il gestionale è del trainer.
|
||||
[/^\/longevity\/gestionale(\/|$)/, ['admin', 'trainer']],
|
||||
[/^\/api\/longevity\/gestionale(\/|$)/, ['admin', 'trainer']],
|
||||
@@ -130,12 +136,18 @@ export function isRole(v: unknown): v is Role {
|
||||
}
|
||||
|
||||
/**
|
||||
* Dove atterra chi ha appena fatto il login. ⚠️ `/admin` non esiste in quest'app: il
|
||||
* fondo della scala è l'indice delle piattaforme, non un pannello.
|
||||
* Dove atterra chi ha appena fatto il login: **sempre l'indice delle piattaforme**, per
|
||||
* tutti i ruoli (deciso da Adriano il 03/09/2026 — si entra e si sceglie dove andare,
|
||||
* anche quando la scelta e' una sola).
|
||||
*
|
||||
* ⚠️ Questa funzione e' anche il "torna a casa" del middleware quando un ruolo apre una
|
||||
* sezione che non gli spetta. Quindi la sua destinazione DEVE essere aperta a ogni ruolo,
|
||||
* o si forma un ciclo di redirect: il middleware nega la pagina, rimanda a landingFor, e
|
||||
* landingFor rimanda dove il middleware nega di nuovo. E' esattamente il guasto che il
|
||||
* sito ha rischiato lo stesso giorno con gli account emigrati. Un test lo presidia
|
||||
* girando su tutti i ruoli.
|
||||
*/
|
||||
export function landingFor(role: string): string {
|
||||
if (role === 'cliente') return '/longevity/io';
|
||||
if (role === 'trainer') return '/longevity/gestionale';
|
||||
export function landingFor(_role: string): string {
|
||||
return '/piattaforme';
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user