#!/usr/bin/env node /** * Script de verificación de contenido faltante * * Compara el contenido local (procedures.ts, drugs.ts, guides-index.ts, material-checklists.ts) * con el contenido en la base de datos para identificar qué falta. * * Uso: * node backend/scripts/verify-content-missing.js */ import dotenv from 'dotenv'; import { query } from '../config/database.js'; import { readFile } from 'fs/promises'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; dotenv.config(); const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const REPO_ROOT = join(__dirname, '../..'); // IDs esperados basados en archivos locales const EXPECTED_PROTOCOLS = [ 'rcp-adulto-svb', 'rcp-adulto-sva', 'rcp-pediatrico', 'obstruccion-via-aerea', 'shock-hemorragico', ]; const EXPECTED_DRUGS = [ 'oxigeno', 'adrenalina', 'amiodarona', 'atropina', 'midazolam', 'salbutamol', ]; const EXPECTED_GUIDES = [ 'abcde-operativo', 'rcp-adulto-svb', 'desa-adulto', 'ovace-adulto', 'ovace-pediatrica', 'parada-respiratoria', 'pcr-traumatica', 'rcp-lactantes', 'rcp-pediatrica', 'reconocimiento-pcr', ]; const EXPECTED_CHECKLISTS = [ 'inicio-turno-material', 'pre-escena-rapido', 'post-servicio-cierre', ]; async function getContentFromDB(type) { const typeMap = { protocol: 'protocol', guide: 'guide', checklist: 'checklist', }; const dbType = typeMap[type] || type; const result = await query(` SELECT slug, title, status FROM tes_content.content_items WHERE type = $1::tes_content.content_type AND version = latest_version ORDER BY slug `, [dbType]); return result.rows.map(row => row.slug); } async function getDrugsFromDB() { const result = await query(` SELECT slug, generic_name, status FROM tes_content.drugs ORDER BY slug `); return result.rows.map(row => row.slug); } async function main() { console.log('\n🔍 Verificando contenido faltante en la base de datos...\n'); try { // Protocolos console.log('📋 PROTOCOLOS:'); const dbProtocols = await getContentFromDB('protocol'); const missingProtocols = EXPECTED_PROTOCOLS.filter(id => !dbProtocols.includes(id)); const extraProtocols = dbProtocols.filter(id => !EXPECTED_PROTOCOLS.includes(id)); console.log(` Esperados: ${EXPECTED_PROTOCOLS.length}`); console.log(` En DB: ${dbProtocols.length}`); console.log(` Faltantes: ${missingProtocols.length}`); if (missingProtocols.length > 0) { console.log(` ❌ Faltantes: ${missingProtocols.join(', ')}`); } else { console.log(` ✅ Todos los protocolos están en la base de datos`); } if (extraProtocols.length > 0) { console.log(` ℹ️ Extra en DB: ${extraProtocols.join(', ')}`); } // Fármacos console.log('\n💊 FÁRMACOS:'); const dbDrugs = await getDrugsFromDB(); const missingDrugs = EXPECTED_DRUGS.filter(id => !dbDrugs.includes(id)); const extraDrugs = dbDrugs.filter(id => !EXPECTED_DRUGS.includes(id)); console.log(` Esperados: ${EXPECTED_DRUGS.length}`); console.log(` En DB: ${dbDrugs.length}`); console.log(` Faltantes: ${missingDrugs.length}`); if (missingDrugs.length > 0) { console.log(` ❌ Faltantes: ${missingDrugs.join(', ')}`); } else { console.log(` ✅ Todos los fármacos están en la base de datos`); } if (extraDrugs.length > 0) { console.log(` ℹ️ Extra en DB: ${extraDrugs.join(', ')}`); } // Guías console.log('\n📚 GUÍAS:'); const dbGuides = await getContentFromDB('guide'); const missingGuides = EXPECTED_GUIDES.filter(id => !dbGuides.includes(id)); const extraGuides = dbGuides.filter(id => !EXPECTED_GUIDES.includes(id)); console.log(` Esperados: ${EXPECTED_GUIDES.length}`); console.log(` En DB: ${dbGuides.length}`); console.log(` Faltantes: ${missingGuides.length}`); if (missingGuides.length > 0) { console.log(` ❌ Faltantes: ${missingGuides.join(', ')}`); } else { console.log(` ✅ Todas las guías están en la base de datos`); } if (extraGuides.length > 0) { console.log(` ℹ️ Extra en DB: ${extraGuides.join(', ')}`); } // Checklists console.log('\n✅ CHECKLISTS:'); const dbChecklists = await getContentFromDB('checklist'); const missingChecklists = EXPECTED_CHECKLISTS.filter(id => !dbChecklists.includes(id)); const extraChecklists = dbChecklists.filter(id => !EXPECTED_CHECKLISTS.includes(id)); console.log(` Esperados: ${EXPECTED_CHECKLISTS.length}`); console.log(` En DB: ${dbChecklists.length}`); console.log(` Faltantes: ${missingChecklists.length}`); if (missingChecklists.length > 0) { console.log(` ❌ Faltantes: ${missingChecklists.join(', ')}`); } else { console.log(` ✅ Todos los checklists están en la base de datos`); } if (extraChecklists.length > 0) { console.log(` ℹ️ Extra en DB: ${extraChecklists.join(', ')}`); } // Resumen const totalMissing = missingProtocols.length + missingDrugs.length + missingGuides.length + missingChecklists.length; console.log('\n📊 RESUMEN:'); console.log(` Total faltante: ${totalMissing} items`); if (totalMissing > 0) { console.log('\n💡 Para sincronizar el contenido faltante, ejecuta:'); console.log(' node backend/scripts/sync-content-to-db.js\n'); } else { console.log('\n✅ ¡Todo el contenido local está en la base de datos!\n'); } } catch (error) { console.error('\n❌ Error verificando contenido:', error.message); console.error(error); process.exit(1); } } main();