From 948068b31224ae4e14a08c5d422ccaebd548d5d7 Mon Sep 17 00:00:00 2001 From: "Adriano (goldrake)" Date: Sat, 26 Sep 2026 13:05:52 +0000 Subject: [PATCH] longevity: index.astro smista per ruolo, test del gestionale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pages/longevity/index.astro: trainer e admin → /longevity/gestionale, cliente → /longevity/io come prima (l'assert esistente sul redirect a /longevity/io resta valido, il ramo cliente lo chiama ancora testualmente). tests/longevity/pagine.test.ts: le quattro pagine del gestionale esistono, usano variante="gestionale", non toccano il DB direttamente e non nominano il database anagrafico riservato; index.astro smista per ruolo. Refs #2 --- .../platforms/src/pages/longevity/index.astro | 11 ++++-- apps/platforms/tests/longevity/pagine.test.ts | 38 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/apps/platforms/src/pages/longevity/index.astro b/apps/platforms/src/pages/longevity/index.astro index 34516da..e33e3fb 100644 --- a/apps/platforms/src/pages/longevity/index.astro +++ b/apps/platforms/src/pages/longevity/index.astro @@ -1,7 +1,12 @@ --- -// Punto di ingresso della piattaforma: non c'è un indice, solo la scorciatoia al -// referto del cliente. La protezione della rotta è già del middleware (isProtectedPath -// e canAccessAdminPath in src/lib/auth.ts). +// Punto di ingresso della piattaforma: smista per ruolo, non è un indice proprio. +// Il trainer e l'admin lavorano nel gestionale (Unità 2b, #2); il cliente resta sulla +// scorciatoia al proprio referto, come prima. La protezione della rotta è già del +// middleware (isProtectedPath e canAccessPath in src/lib/auth.ts): qui arriva solo chi è +// già autenticato su una delle due sezioni. export const prerender = false; + +const ruolo = Astro.locals.user?.role; +if (ruolo === 'admin' || ruolo === 'trainer') return Astro.redirect('/longevity/gestionale'); return Astro.redirect('/longevity/io'); --- diff --git a/apps/platforms/tests/longevity/pagine.test.ts b/apps/platforms/tests/longevity/pagine.test.ts index c4ce3c7..badca69 100644 --- a/apps/platforms/tests/longevity/pagine.test.ts +++ b/apps/platforms/tests/longevity/pagine.test.ts @@ -94,3 +94,41 @@ describe('il guscio della piattaforma', () => { expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/io['"`]/); }); }); + +describe('il gestionale del trainer (Unità 2b)', () => { + const PAGINE_GESTIONALE = [ + 'src/pages/longevity/gestionale/index.astro', + 'src/pages/longevity/gestionale/nuovo.astro', + 'src/pages/longevity/gestionale/cliente/[code].astro', + 'src/pages/longevity/gestionale/cliente/[code]/checkup.astro', + ]; + + it('ogni pagina del gestionale esiste e usa la variante "gestionale" del layout', () => { + for (const p of PAGINE_GESTIONALE) { + expect(existsSync(join(process.cwd(), p))).toBe(true); + expect(leggi(p)).toMatch(/variante=["']gestionale["']/); + } + }); + + it('nessuna pagina del gestionale interroga il database direttamente', () => { + // Il gestionale legge sempre attraverso lib/longevity (anagrafica, gestionale, vista): + // una .prepare( dentro una .astro sarebbe una query scritta a mano nella pagina. + for (const p of PAGINE_GESTIONALE) { + expect(leggi(p)).not.toMatch(/\.prepare\(/); + } + }); + + it('nessuna pagina del gestionale nomina il database anagrafico riservato', () => { + for (const p of PAGINE_GESTIONALE) { + expect(leggi(p)).not.toMatch(/Identity/); + } + }); + + it('index.astro smista per ruolo: trainer e admin al gestionale, il cliente al proprio referto', () => { + const src = leggi('src/pages/longevity/index.astro'); + expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/gestionale['"`]/); + expect(src).toMatch(/trainer/); + expect(src).toMatch(/admin/); + expect(src).toMatch(/Astro\.redirect\(\s*['"`]\/longevity\/io['"`]/); + }); +});