// Crea (o re-activa) el usuario Administrador inicial con una clave fuerte generada al azar, // mostrada UNA sola vez. Para produccion — NUNCA usar la convencion clave=usuario aqui. // Uso: node src/scripts/create-admin.js "Nombre Apellido" correo@dominio.com import crypto from 'node:crypto'; import bcrypt from 'bcryptjs'; import mysql from 'mysql2/promise'; import { env } from '../config/env.js'; const [name, email] = process.argv.slice(2); if (!name || !email) { console.error('Uso: node src/scripts/create-admin.js "Nombre Apellido" correo@dominio.com'); process.exit(1); } async function run() { const db = await mysql.createConnection({ host: env.db.host, port: env.db.port, database: env.db.name, user: env.db.user, password: env.db.password, }); const [adminRole] = await db.query("SELECT id FROM roles WHERE code = 'admin'"); if (!adminRole.length) throw new Error('Rol admin no existe — correr primero npm run seed'); const password = crypto.randomBytes(18).toString('base64').replace(/[/+=]/g, '').slice(0, 20); const passwordHash = await bcrypt.hash(password, 12); await db.query( `INSERT INTO users (name, email, password_hash, role_id, department_id, position, is_active) VALUES (?, ?, ?, ?, NULL, NULL, 1) ON DUPLICATE KEY UPDATE password_hash = VALUES(password_hash), is_active = 1`, [name, email, passwordHash, adminRole[0].id] ); console.log('[create-admin] listo. Guarda esta clave ahora — no se muestra de nuevo:'); console.log(` email: ${email}`); console.log(` clave: ${password}`); await db.end(); } run().catch((err) => { console.error('[create-admin] error:', err.message); process.exit(1); });