fix: standardized admin user creation from env vars on deployment and dev memory fallback
This commit is contained in:
+27
-37
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user