Compare commits

...

2 commits

Author SHA1 Message Date
Javier 4d31900098 docs: update progress
Some checks are pending
Deploy Código 0 / deploy (push) Waiting to run
2026-03-23 10:17:12 +01:00
Javier c242a93f6e fix(protocols): fix yaml syntax formats and complete yaml-to-mongo script 2026-03-23 10:13:17 +01:00
9 changed files with 50 additions and 15 deletions

View file

@ -28,3 +28,4 @@ Registro histórico de hitos y sesiones del proyecto.
- Ejecutar migración masiva de protocolos. - Ejecutar migración masiva de protocolos.
- Conectar renderer a la API de MongoDB. - Conectar renderer a la API de MongoDB.
- Redacción de manuales prioritarios. - Redacción de manuales prioritarios.
- [2026-03-23] Migración YAML a MongoDB completada exitosamente.

View file

@ -1,5 +1,5 @@
import mongoose, { Schema, Document } from 'mongoose'; import mongoose, { Schema, Document } from 'mongoose';
import { ClinicalProtocol } from '../../domain/entities/ClinicalProtocol'; import { ClinicalProtocol } from '../../../domain/entities/ClinicalProtocol';
const ProtocolStepSchema = new Schema({ const ProtocolStepSchema = new Schema({
tipo: { type: String, enum: ['checklist', 'decision', 'tecnica', 'info'], required: true }, tipo: { type: String, enum: ['checklist', 'decision', 'tecnica', 'info'], required: true },
@ -74,6 +74,6 @@ const ClinicalProtocolSchema = new Schema({
collection: 'protocols' collection: 'protocols'
}); });
export interface ProtocolDocument extends ClinicalProtocol, Document {} export interface ProtocolDocument extends Omit<ClinicalProtocol, 'id'>, Document {}
export const ProtocolModel = mongoose.model<ProtocolDocument>('Protocol', ClinicalProtocolSchema); export const ProtocolModel = mongoose.model<ProtocolDocument>('Protocol', ClinicalProtocolSchema);

View file

@ -17,6 +17,20 @@ async function migrate() {
await mongoose.connect(MONGODB_URI); await mongoose.connect(MONGODB_URI);
console.log('✅ Conectado a MongoDB'); console.log('✅ Conectado a MongoDB');
function normalizeItems(items: any[] | undefined): string[] {
if (!items) return [];
return items.map(item => {
if (typeof item === 'string') return item;
if (typeof item === 'object' && item !== null) {
const entries = Object.entries(item);
if (entries.length > 0) {
const [key, value] = entries[0];
return `${key}: ${value}`;
}
}
return String(item);
});
}
const folders = fs.readdirSync(PROTOCOLS_DIR); const folders = fs.readdirSync(PROTOCOLS_DIR);
let totalMigrated = 0; let totalMigrated = 0;
@ -29,12 +43,33 @@ async function migrate() {
for (const file of files) { for (const file of files) {
const filePath = path.join(folderPath, file); const filePath = path.join(folderPath, file);
const content = fs.readFileSync(filePath, 'utf8'); const content = fs.readFileSync(filePath, 'utf8');
const data = yaml.load(content) as ClinicalProtocol; const data = yaml.load(content) as any;
if (!data.id) { if (!data.id) {
data.id = file.replace('.yaml', ''); data.id = file.replace('.yaml', '');
} }
// Normalizar items en pasos
if (data.pasos) {
data.pasos = data.pasos.map((p: any) => ({
...p,
items: normalizeItems(p.items)
}));
}
// Normalizar items en fases
if (data.fases) {
data.fases = data.fases.map((f: any) => ({
...f,
items: normalizeItems(f.items)
}));
}
// Normalizar equipamiento
if (data.equipamiento) {
data.equipamiento = normalizeItems(data.equipamiento);
}
// Upsert // Upsert
await ProtocolModel.findOneAndUpdate( await ProtocolModel.findOneAndUpdate(
{ id: data.id }, { id: data.id },

View file

@ -36,6 +36,8 @@ services:
mongodb: mongodb:
image: mongo:latest image: mongo:latest
container_name: codigo0-mongodb container_name: codigo0-mongodb
ports:
- "27017:27017"
restart: always restart: always
volumes: volumes:
- mongodb_data:/data/db - mongodb_data:/data/db

View file

@ -21,8 +21,8 @@ pasos:
titulo: Valoración Clínica titulo: Valoración Clínica
descripcion: Signos típicos de crisis. descripcion: Signos típicos de crisis.
items: items:
- Valorar triada: Polidipsia (mucha sed), Poliuria, Polifagia - "Valorar triada: Polidipsia (mucha sed), Poliuria, Polifagia"
- Evaluar hidratación: Mucosas secas, signo del pliegue (+) - "Evaluar hidratación: Mucosas secas, signo del pliegue (+)"
- Verificar nivel de consciencia (Glasgow) - Verificar nivel de consciencia (Glasgow)
- Medir constantes vitales (TA, FC, Tª) - Medir constantes vitales (TA, FC, Tª)
@ -45,11 +45,11 @@ pasos:
- Monitorización continua del ritmo cardíaco (Riesgo de arritmias por potasio) - Monitorización continua del ritmo cardíaco (Riesgo de arritmias por potasio)
- tipo: info - tipo: info
titulo: Identificación: CAD vs EHH titulo: "Identificación: CAD vs EHH"
descripcion: Diferenciación rápida para el informe médico. descripcion: Diferenciación rápida para el informe médico.
items: items:
- Cetoacidosis (CAD): Más frecuente en DM1, inicio rápido, aliento cetósico y dolor abdominal. - "Cetoacidosis (CAD): Más frecuente en DM1, inicio rápido, aliento cetósico y dolor abdominal."
- Estado Hiperosmolar (EHH): Más frecuente en DM2 (ancianos), inicio lento, deshidratación extrema y alteraciones neurológicas. - "Estado Hiperosmolar (EHH): Más frecuente en DM2 (ancianos), inicio lento, deshidratación extrema y alteraciones neurológicas."
# ─── FÁRMACOS ────────────────────────────────────────────────── # ─── FÁRMACOS ──────────────────────────────────────────────────
farmacos: farmacos:

View file

@ -13,9 +13,6 @@ alertas:
- tipo: danger - tipo: danger
texto: "Mantener alineación espinal en pacientes traumáticos." texto: "Mantener alineación espinal en pacientes traumáticos."
- tipo: warning - tipo: warning
text
#警戒
texto: "Usar técnicas ergonómicas para prevenir lesiones." texto: "Usar técnicas ergonómicas para prevenir lesiones."
# ─── PRINCIPIOS ──────────────────────────────────────────────── # ─── PRINCIPIOS ────────────────────────────────────────────────

View file

@ -40,7 +40,7 @@ pasos:
descripcion: "Verificar respiración correcta a través de la cánula." descripcion: "Verificar respiración correcta a través de la cánula."
# ─── TÉCNICA NASOFARINGEA ──────────────────────────────────── # ─── TÉCNICA NASOFARINGEA ────────────────────────────────────
pasos:
- tipo: tecnica - tipo: tecnica
titulo: Preparación titulo: Preparación
descripcion: "Lubricar cánula." descripcion: "Lubricar cánula."

View file

@ -26,7 +26,7 @@ tecnicas:
- titulo: Presión indirecta - titulo: Presión indirecta
prioridad: 3 prioridad: 3
descripcion: "Presionar arteria proximal." descripcion: "Presionar arteria proximal."
- torniquete - titulo: Torniquete
prioridad: 4 prioridad: 4
descripcion: "Último recurso para hemorragia masiva de extremidad." descripcion: "Último recurso para hemorragia masiva de extremidad."

View file

@ -11,7 +11,7 @@ actualizado: 2025-12-23
# ─── ALERTAS GLOBALES ───────────────────────────────────────── # ─── ALERTAS GLOBALES ─────────────────────────────────────────
alertas: alertas:
- tipo: danger - tipo: danger
texto: "¿Puede hablar?" - Es la pregunta diagnóstica clave. texto: '"¿Puede hablar?" - Es la pregunta diagnóstica clave.'
- tipo: danger - tipo: danger
texto: "Si puede hablar/toser bien: ANIMA A TOSER. Si no: ACTÚA." texto: "Si puede hablar/toser bien: ANIMA A TOSER. Si no: ACTÚA."
- tipo: warning - tipo: warning