6301f521fd
Campus, Stress Index e Longevity escono dal sito e diventano apps.insanitylab.it, con utenti, sessioni, login e database propri. Deciso da Adriano il 03/09/2026: una repo sola, due applicazioni autosufficienti, cosi' che ognuna resti estraibile. Misura che ha guidato il taglio: le tre aree condividevano col sito SOLO l'identita' - ~170 righe fra auth.ts, middleware.ts e safe-next.ts. Layout, librerie e dati erano gia' disgiunti. Lato piattaforme: - ruoli piattaforme/cliente/trainer/admin, senza quelli redazionali - canAccessPath con default CHIUSO (nel sito era aperto: li' le rotte non elencate erano di chiunque fosse loggato, qui ogni sezione e' di qualcuno) - tutta l'app protetta, si elencano le eccezioni invece dei prefissi protetti - /api risponde 401/403, non un redirect verso una pagina di login - tre database distinti: utenti, dati clinici senza nomi, mappatura coi nomi Lato sito: - ROLES tornano i tre redazionali; via le regole e il login pubblico - il login del pannello RESPINGE un account emigrato invece di aprirgli una sessione: senza, landingFor lo mandava su /admin, il middleware glielo negava, e si formava un ciclo di redirect che sembra un guasto del sito - l'header non mostra piu' un menu delle piattaforme: un link che esce Verificato: sito 20 file / 146 test, piattaforme 26 file / 197 test, entrambi i build passano, e l'app girata davvero in locale - il ruolo piattaforme entra in Campus e viene rimbalzato da Longevity, il cliente il contrario. Non ancora in produzione: manca il record DNS di apps.insanitylab.it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EndnceRA5WnA6rvA5iV9WL
31 lines
1.3 KiB
JavaScript
31 lines
1.3 KiB
JavaScript
import Database from 'better-sqlite3';
|
|
import bcrypt from 'bcryptjs';
|
|
import { mkdirSync } from 'node:fs';
|
|
import { dirname } from 'node:path';
|
|
|
|
const [, , username, password, role = 'admin'] = process.argv;
|
|
if (!username || !password) {
|
|
console.error('Uso: npm run create-user -- <username> <password> [role]');
|
|
process.exit(1);
|
|
}
|
|
// Lista duplicata di proposito: questo file è JavaScript e non può importare da
|
|
// src/lib/auth.ts. La fonte vera è ROLES in src/lib/auth.ts - se cambia là, va allineata qui.
|
|
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';
|
|
mkdirSync(dirname(path), { recursive: true });
|
|
const db = new Database(path);
|
|
db.exec(`CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'admin'
|
|
);`);
|
|
db.prepare(
|
|
`INSERT INTO users (username, password_hash, role) VALUES (?, ?, ?)
|
|
ON CONFLICT(username) DO UPDATE SET password_hash = excluded.password_hash, role = excluded.role`
|
|
).run(username, bcrypt.hashSync(password, 12), role);
|
|
console.log(`Utente "${username}" creato/aggiornato in ${path}`);
|