- Agrega endpoint PUT /api/camas/:id en servidor - Corrige nombre de tabla SQL de cama a camas - Actualiza estado de camas en memoria al cambiar internacion - Agrega retry logic para evitar SQLITE_BUSY - Mejora delay entre actualizaciones de cama
249 lines
6.8 KiB
JavaScript
249 lines
6.8 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);
|
|
}
|
|
|
|
export async function getAllPacientes() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM pacientes');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllAreas() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM areas');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllCamas() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM camas');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function updateCama(id, updates) {
|
|
const db = await openDb();
|
|
const fields = [];
|
|
const values = [];
|
|
if (updates.estado !== undefined) {
|
|
fields.push('estado = ?');
|
|
values.push(updates.estado);
|
|
}
|
|
if (updates.pacienteId !== undefined) {
|
|
fields.push('pacienteId = ?');
|
|
values.push(updates.pacienteId);
|
|
}
|
|
if (updates.internacionId !== undefined) {
|
|
fields.push('internacionId = ?');
|
|
values.push(updates.internacionId);
|
|
}
|
|
if (fields.length > 0) {
|
|
values.push(id);
|
|
await db.run(`UPDATE camas SET ${fields.join(', ')} WHERE id = ?`, values);
|
|
}
|
|
await db.close();
|
|
}
|
|
|
|
export async function getAllInternaciones() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM internaciones');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllEvoluciones() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM evoluciones');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllLaboratorios() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM laboratorios');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllAcidosBase() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM acidosbase');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllCultivos() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM cultivos');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllEstudiosComplementarios() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM estudiosComplementarios');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllInterconsultas() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM interconsultas');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllAtb() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM atb');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllIndicaciones() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM indicaciones');
|
|
await db.close();
|
|
return rows;
|
|
}
|
|
|
|
export async function getAllMovimientosIndicaciones() {
|
|
const db = await openDb();
|
|
const rows = await db.all('SELECT * FROM movimientos_indicaciones');
|
|
await db.close();
|
|
return rows;
|
|
}
|