Checkpoint: Application du skill itinova-user-management : authentification locale enrichie (login/email, 3 profils admin/standard/readonly), schéma DB étendu (firstName, lastName, login, isActive), page de connexion avec logo FEHAP, middleware writeProcedure pour les comptes readonly, formulaire Admin mis à jour. 33 tests Vitest passés, 0 erreur TypeScript.

This commit is contained in:
Manus
2026-04-21 06:45:32 -04:00
parent 11ffb77005
commit ff2a141ea4
15 changed files with 1391 additions and 219 deletions

35
seed-admin.mjs Normal file
View File

@@ -0,0 +1,35 @@
/**
* Seed : crée le compte administrateur par défaut si inexistant.
* Login : adminItinova | Mot de passe : Itinova69!
*/
import mysql from 'mysql2/promise';
import bcrypt from 'bcrypt';
const conn = await mysql.createConnection(process.env.DATABASE_URL);
// Vérifier si l'admin existe déjà
const [rows] = await conn.execute("SELECT id FROM users WHERE login = 'adminItinova' LIMIT 1");
if (rows.length > 0) {
console.log('Admin déjà existant, seed ignoré.');
await conn.end();
process.exit(0);
}
// Créer l'utilisateur admin
const [result] = await conn.execute(
`INSERT INTO users (login, email, firstName, lastName, name, role, sonumRole, isActive, loginMethod, cguAccepted, lastSignedIn, createdAt, updatedAt)
VALUES (?, ?, ?, ?, ?, 'admin', 'gestionnaire', 1, 'local', 1, NOW(), NOW(), NOW())`,
['adminItinova', 'adminItinova@santinova-soft.org', 'Admin', 'SONUM', 'Admin SONUM']
);
const userId = result.insertId;
// Hasher le mot de passe
const hash = await bcrypt.hash('Itinova69!', 10);
await conn.execute(
`INSERT INTO local_credentials (userId, passwordHash, createdAt, updatedAt) VALUES (?, ?, NOW(), NOW())`,
[userId, hash]
);
console.log(`Admin créé avec succès (id=${userId})`);
await conn.end();