task-5 fix: isRole, login redirect, create-user script per cliente e trainer

This commit is contained in:
2026-08-21 19:53:12 +02:00
parent 473c0d8c36
commit d3abbf9bf7
4 changed files with 30 additions and 5 deletions
+2 -2
View File
@@ -8,8 +8,8 @@ if (!username || !password) {
console.error('Uso: npm run create-user -- <username> <password> [role]');
process.exit(1);
}
if (!['admin', 'superuser', 'user', 'campus'].includes(role)) {
console.error('Ruolo non valido. Ammessi: admin, superuser, user, campus');
if (!['admin', 'superuser', 'user', 'piattaforme', 'cliente', 'trainer'].includes(role)) {
console.error('Ruolo non valido. Ammessi: admin, superuser, user, piattaforme, cliente, trainer');
process.exit(1);
}
const path = process.env.DB_PATH ?? 'data/insanitylab.db';
+1 -1
View File
@@ -118,7 +118,7 @@ export function randomPassword(): string {
}
export function isRole(v: unknown): v is Role {
return v === 'admin' || v === 'superuser' || v === 'user' || v === 'piattaforme';
return v === 'admin' || v === 'superuser' || v === 'user' || v === 'piattaforme' || v === 'cliente' || v === 'trainer';
}
export function landingFor(role: string): string {
+1 -1
View File
@@ -16,7 +16,7 @@ export const onRequest = defineMiddleware((context, next) => {
}
// Le piattaforme riservate si raggiungono dal sito, quindi passano dal login
// pubblico e ci tornano dopo l'accesso; il pannello ha il proprio.
if (pathname.startsWith('/campus') || pathname.startsWith('/piattaforme'))
if (pathname.startsWith('/campus') || pathname.startsWith('/piattaforme') || pathname.startsWith('/longevity'))
return context.redirect(`/login?next=${encodeURIComponent(pathname)}`);
return context.redirect('/admin/login');
}
+26 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { canAccessAdminPath, isProtectedPath, landingFor } from '../../src/lib/auth';
import { canAccessAdminPath, isProtectedPath, landingFor, isRole } from '../../src/lib/auth';
describe('accesso alle rotte longevity', () => {
it('il cliente entra nel proprio spazio', () => {
@@ -21,6 +21,12 @@ describe('accesso alle rotte longevity', () => {
expect(canAccessAdminPath('cliente', '/admin/posts')).toBe(false);
});
it('il trainer non entra nelle altre piattaforme ne nel blog', () => {
expect(canAccessAdminPath('trainer', '/campus')).toBe(false);
expect(canAccessAdminPath('trainer', '/admin/content')).toBe(false);
expect(canAccessAdminPath('trainer', '/admin/posts')).toBe(false);
});
it('il ruolo piattaforme non eredita longevity', () => {
expect(canAccessAdminPath('piattaforme', '/longevity/gestionale')).toBe(false);
});
@@ -68,3 +74,22 @@ describe('landingFor — indirizzo di atterraggio per ruolo', () => {
expect(landingFor('user')).toBe('/admin');
});
});
describe('isRole — validazione dei ruoli', () => {
it('cliente e trainer sono ruoli validi', () => {
expect(isRole('cliente')).toBe(true);
expect(isRole('trainer')).toBe(true);
});
it('i ruoli già esistenti restano validi', () => {
expect(isRole('admin')).toBe(true);
expect(isRole('superuser')).toBe(true);
expect(isRole('user')).toBe(true);
expect(isRole('piattaforme')).toBe(true);
});
it('campus e stringhe inventate non sono ruoli', () => {
expect(isRole('campus')).toBe(false);
expect(isRole('qualsiasi-cosa')).toBe(false);
});
});