fix: standardized admin user creation from env vars on deployment and dev memory fallback

This commit is contained in:
2026-08-10 07:37:58 +00:00
parent 859af13364
commit bd491fcda1
3 changed files with 31 additions and 52 deletions
-14
View File
@@ -664,20 +664,6 @@ app.post('/api/auth/login', async (req, res) => {
return res.status(400).json({ error: 'DNI y contraseña requeridos' });
}
// Bypass TOTAL "en memoria" directamente en el controlador de la API para entornos sin DB
const adminDni = process.env.ADMIN_DNI || '12345678';
const adminPassword = process.env.ADMIN_PASSWORD || 'admin123';
if (((String(dni) === adminDni || String(dni) === '12345678') || dni === 'admin') && (password === adminPassword || password === 'admin123')) {
return res.json({
id: 'admin-hardcoded-api',
apellido: 'Administrador',
nombre: 'Sistema (Memoria)',
dni: String(dni),
rol: 'admin'
});
}
const usuario = await getUsuarioByDni(dni);
if (!usuario) {
return res.status(401).json({ error: 'Usuario no encontrado' });
+27 -37
View File
@@ -19,9 +19,30 @@ const DB_NAME = process.env.DB_NAME || 'hospital';
let client;
let db = null;
// Helper to create default admin object from env or fallback
function createDefaultAdminUser() {
const adminDni = process.env.ADMIN_DNI || '12345678';
const adminPassword = process.env.ADMIN_PASSWORD || 'admin123';
const adminNombre = process.env.ADMIN_NOMBRE || 'Sistema';
const adminApellido = process.env.ADMIN_APELLIDO || 'Administrador';
const adminEmail = process.env.ADMIN_EMAIL || 'admin@hospital.local';
return {
id: 'admin-default',
apellido: adminApellido,
nombre: adminNombre,
dni: adminDni,
fechaNacimiento: '1990-01-01',
email: adminEmail,
rol: 'admin',
passwordHash: hashSync(adminPassword, 10),
fechaCreacion: new Date().toISOString().split('T')[0]
};
}
// In-memory fallback store when DB is not connected
const memStore = {
usuarios: [],
usuarios: [createDefaultAdminUser()],
pacientes: [],
areas: [],
camas: [],
@@ -54,27 +75,14 @@ export async function initDb() {
await db.collection('pacientes').createIndex({ dni: 1 }, { unique: true });
await db.collection('areas').createIndex({ nombre: 1 }, { unique: true });
// Check if default admin exists
// Check if default admin exists in MongoDB in production
const adminDni = process.env.ADMIN_DNI || '12345678';
const adminExists = await db.collection('usuarios').findOne({ dni: adminDni });
if (!adminExists) {
const adminPassword = process.env.ADMIN_PASSWORD || 'admin123';
const adminHash = hashSync(adminPassword, 10);
const adminUser = {
id: 'admin-default',
apellido: 'Administrador',
nombre: 'Sistema',
dni: adminDni,
fechaNacimiento: '1990-01-01',
email: 'admin@hospital.local',
rol: 'admin',
passwordHash: adminHash,
fechaCreacion: new Date().toISOString().split('T')[0]
};
await db.collection('usuarios').insertOne(adminUser);
console.log(`Default admin created/ensured: DNI ${adminDni} / Password ${adminPassword}`);
const defaultAdmin = createDefaultAdminUser();
await db.collection('usuarios').insertOne(defaultAdmin);
console.log(`Default admin created/ensured in database: DNI ${adminDni}`);
}
} catch (error) {
console.error('Failed to initialize MongoDB (will use in-memory store):', error.message || error);
@@ -97,18 +105,6 @@ function cleanDocs(docs) {
// ========== USUARIOS ==========
export async function getUsuarioByDni(dni) {
const dniStr = String(dni).trim();
const adminDni = process.env.ADMIN_DNI || '12345678';
if (dniStr === adminDni || dniStr === '12345678' || dniStr === 'admin') {
return {
id: 'admin-hardcoded-dev',
apellido: 'Administrador',
nombre: 'Desarrollo (Memoria)',
dni: dniStr,
rol: 'admin',
fechaCreacion: new Date().toISOString()
};
}
if (db) {
const user = await db.collection('usuarios').findOne({ dni: dniStr });
@@ -170,16 +166,10 @@ export async function deleteUsuario(id) {
export async function verifyPassword(dni, password) {
const dniStr = String(dni).trim();
const adminDni = process.env.ADMIN_DNI || '12345678';
const adminPassword = process.env.ADMIN_PASSWORD || 'admin123';
if ((dniStr === adminDni || dniStr === '12345678' || dniStr === 'admin') && (password === adminPassword || password === 'admin123')) {
return true;
}
if (db) {
const user = await db.collection('usuarios').findOne({ dni: dniStr });
if (!user) return false;
if (!user || !user.passwordHash) return false;
return compareSync(password, user.passwordHash);
}
const user = memStore.usuarios.find(u => String(u.dni) === dniStr);