- Agregar Login con autenticación por DNI y contraseña - Crear tabla de usuarios con roles (admin, médico, enfermero) - Implementar gestión de usuarios (CRUD) para administradores - Agregar control de permisos basado en roles en el menú - Persistir estado de sesión en backend - Inicializar usuario admin por defecto (DNI: 12345678, pass: admin123) - Corregir inicialización de arrays en el store para evitar errores al cargar estado
135 lines
4.0 KiB
JavaScript
135 lines
4.0 KiB
JavaScript
import sqlite3 from 'sqlite3';
|
|
import { open } from 'sqlite';
|
|
import { dirname } from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
import bcrypt from 'bcryptjs';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const DB_PATH = __dirname + '/data/hospital.db';
|
|
|
|
export async function openDb() {
|
|
const db = await open({
|
|
filename: DB_PATH,
|
|
driver: sqlite3.Database,
|
|
});
|
|
|
|
await db.exec(`
|
|
CREATE TABLE IF NOT EXISTS kv (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT
|
|
);
|
|
`);
|
|
|
|
await db.exec(`
|
|
CREATE TABLE IF NOT EXISTS usuarios (
|
|
id TEXT PRIMARY KEY,
|
|
apellido TEXT NOT NULL,
|
|
nombre TEXT NOT NULL,
|
|
dni TEXT UNIQUE NOT NULL,
|
|
fechaNacimiento TEXT NOT NULL,
|
|
email TEXT NOT NULL,
|
|
rol TEXT NOT NULL CHECK(rol IN ('admin', 'medico', 'enfermero')),
|
|
matriculaProfesional TEXT,
|
|
passwordHash TEXT NOT NULL,
|
|
areaId TEXT,
|
|
fechaCreacion TEXT NOT NULL
|
|
);
|
|
`);
|
|
|
|
return db;
|
|
}
|
|
|
|
export async function getValue(key) {
|
|
const db = await openDb();
|
|
const row = await db.get('SELECT value FROM kv WHERE key = ?', key);
|
|
await db.close();
|
|
return row?.value ?? null;
|
|
}
|
|
|
|
export async function setValue(key, value) {
|
|
const db = await openDb();
|
|
await db.run('INSERT INTO kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value', key, value);
|
|
await db.close();
|
|
}
|
|
|
|
export async function getUsuarioByDni(dni) {
|
|
const db = await openDb();
|
|
const row = await db.get('SELECT * FROM usuarios WHERE dni = ?', dni);
|
|
await db.close();
|
|
return row || null;
|
|
}
|
|
|
|
export async function getUsuarioById(id) {
|
|
const db = await openDb();
|
|
const row = await db.get('SELECT * FROM usuarios WHERE id = ?', id);
|
|
await db.close();
|
|
return row || null;
|
|
}
|
|
|
|
export async function getAllUsuarios() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM usuarios ORDER BY apellido, nombre');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function createUsuario(usuario) {
|
|
const db = await openDb();
|
|
await db.run(
|
|
`INSERT INTO usuarios (id, apellido, nombre, dni, fechaNacimiento, email, rol, matriculaProfesional, passwordHash, areaId, fechaCreacion)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
usuario.id,
|
|
usuario.apellido,
|
|
usuario.nombre,
|
|
usuario.dni,
|
|
usuario.fechaNacimiento,
|
|
usuario.email,
|
|
usuario.rol,
|
|
usuario.matriculaProfesional || null,
|
|
usuario.passwordHash,
|
|
usuario.areaId || null,
|
|
usuario.fechaCreacion
|
|
);
|
|
await db.close();
|
|
}
|
|
|
|
export async function updateUsuario(id, datos) {
|
|
const db = await openDb();
|
|
const fields = [];
|
|
const values = [];
|
|
|
|
if (datos.apellido !== undefined) { fields.push('apellido = ?'); values.push(datos.apellido); }
|
|
if (datos.nombre !== undefined) { fields.push('nombre = ?'); values.push(datos.nombre); }
|
|
if (datos.fechaNacimiento !== undefined) { fields.push('fechaNacimiento = ?'); values.push(datos.fechaNacimiento); }
|
|
if (datos.email !== undefined) { fields.push('email = ?'); values.push(datos.email); }
|
|
if (datos.rol !== undefined) { fields.push('rol = ?'); values.push(datos.rol); }
|
|
if (datos.matriculaProfesional !== undefined) { fields.push('matriculaProfesional = ?'); values.push(datos.matriculaProfesional); }
|
|
if (datos.passwordHash !== undefined) { fields.push('passwordHash = ?'); values.push(datos.passwordHash); }
|
|
if (datos.areaId !== undefined) { fields.push('areaId = ?'); values.push(datos.areaId); }
|
|
|
|
if (fields.length > 0) {
|
|
values.push(id);
|
|
await db.run(`UPDATE usuarios SET ${fields.join(', ')} WHERE id = ?`, values);
|
|
}
|
|
await db.close();
|
|
}
|
|
|
|
export async function deleteUsuario(id) {
|
|
const db = await openDb();
|
|
await db.run('DELETE FROM usuarios WHERE id = ?', id);
|
|
await db.close();
|
|
}
|
|
|
|
export async function verifyPassword(dni, password) {
|
|
const db = await openDb();
|
|
const row = await db.get('SELECT passwordHash FROM usuarios WHERE dni = ?', dni);
|
|
await db.close();
|
|
|
|
if (!row) return false;
|
|
return bcrypt.compareSync(password, row.passwordHash);
|
|
}
|
|
|
|
export async function hashPassword(password) {
|
|
return bcrypt.hashSync(password, 10);
|
|
}
|