fix: standardized admin user creation from env vars on deployment and dev memory fallback
This commit is contained in:
+4
-1
@@ -12,6 +12,9 @@ APP_URL="MY_APP_URL"
|
|||||||
MONGODB_URI="mongodb://127.0.0.1:27017"
|
MONGODB_URI="mongodb://127.0.0.1:27017"
|
||||||
DB_NAME="hospital"
|
DB_NAME="hospital"
|
||||||
|
|
||||||
# Default Admin Credentials (Optional, defaults will be used if not set)
|
# Default Admin Credentials (Used on initial deployment/startup)
|
||||||
ADMIN_DNI="12345678"
|
ADMIN_DNI="12345678"
|
||||||
ADMIN_PASSWORD="admin123"
|
ADMIN_PASSWORD="admin123"
|
||||||
|
ADMIN_NOMBRE="Sistema"
|
||||||
|
ADMIN_APELLIDO="Administrador"
|
||||||
|
ADMIN_EMAIL="admin@hospital.local"
|
||||||
|
|||||||
@@ -664,20 +664,6 @@ app.post('/api/auth/login', async (req, res) => {
|
|||||||
return res.status(400).json({ error: 'DNI y contraseña requeridos' });
|
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);
|
const usuario = await getUsuarioByDni(dni);
|
||||||
if (!usuario) {
|
if (!usuario) {
|
||||||
return res.status(401).json({ error: 'Usuario no encontrado' });
|
return res.status(401).json({ error: 'Usuario no encontrado' });
|
||||||
|
|||||||
+27
-37
@@ -19,9 +19,30 @@ const DB_NAME = process.env.DB_NAME || 'hospital';
|
|||||||
let client;
|
let client;
|
||||||
let db = null;
|
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
|
// In-memory fallback store when DB is not connected
|
||||||
const memStore = {
|
const memStore = {
|
||||||
usuarios: [],
|
usuarios: [createDefaultAdminUser()],
|
||||||
pacientes: [],
|
pacientes: [],
|
||||||
areas: [],
|
areas: [],
|
||||||
camas: [],
|
camas: [],
|
||||||
@@ -54,27 +75,14 @@ export async function initDb() {
|
|||||||
await db.collection('pacientes').createIndex({ dni: 1 }, { unique: true });
|
await db.collection('pacientes').createIndex({ dni: 1 }, { unique: true });
|
||||||
await db.collection('areas').createIndex({ nombre: 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 adminDni = process.env.ADMIN_DNI || '12345678';
|
||||||
const adminExists = await db.collection('usuarios').findOne({ dni: adminDni });
|
const adminExists = await db.collection('usuarios').findOne({ dni: adminDni });
|
||||||
|
|
||||||
if (!adminExists) {
|
if (!adminExists) {
|
||||||
const adminPassword = process.env.ADMIN_PASSWORD || 'admin123';
|
const defaultAdmin = createDefaultAdminUser();
|
||||||
const adminHash = hashSync(adminPassword, 10);
|
await db.collection('usuarios').insertOne(defaultAdmin);
|
||||||
|
console.log(`Default admin created/ensured in database: DNI ${adminDni}`);
|
||||||
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}`);
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to initialize MongoDB (will use in-memory store):', error.message || error);
|
console.error('Failed to initialize MongoDB (will use in-memory store):', error.message || error);
|
||||||
@@ -97,18 +105,6 @@ function cleanDocs(docs) {
|
|||||||
// ========== USUARIOS ==========
|
// ========== USUARIOS ==========
|
||||||
export async function getUsuarioByDni(dni) {
|
export async function getUsuarioByDni(dni) {
|
||||||
const dniStr = String(dni).trim();
|
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) {
|
if (db) {
|
||||||
const user = await db.collection('usuarios').findOne({ dni: dniStr });
|
const user = await db.collection('usuarios').findOne({ dni: dniStr });
|
||||||
@@ -170,16 +166,10 @@ export async function deleteUsuario(id) {
|
|||||||
|
|
||||||
export async function verifyPassword(dni, password) {
|
export async function verifyPassword(dni, password) {
|
||||||
const dniStr = String(dni).trim();
|
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) {
|
if (db) {
|
||||||
const user = await db.collection('usuarios').findOne({ dni: dniStr });
|
const user = await db.collection('usuarios').findOne({ dni: dniStr });
|
||||||
if (!user) return false;
|
if (!user || !user.passwordHash) return false;
|
||||||
return compareSync(password, user.passwordHash);
|
return compareSync(password, user.passwordHash);
|
||||||
}
|
}
|
||||||
const user = memStore.usuarios.find(u => String(u.dni) === dniStr);
|
const user = memStore.usuarios.find(u => String(u.dni) === dniStr);
|
||||||
|
|||||||
Reference in New Issue
Block a user