Files
administracionHospital/server/db.js
T
snlavaise e996f92d71 Fix: actualiza estado de cama en tabla camas al cambiar internacion
- 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
2026-04-23 23:44:28 -03:00

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;
}