/** * ⚠️ ⚠️ ⚠️ ENDPOINT DE DEBUG - TEMPORAL ⚠️ ⚠️ ⚠️ * * POST /api/debug/export-database * * EXPORTA TODA LA BASE DE DATOS A UN ARCHIVO SQL (pg_dump) * * ⚠️ NO ELIMINAR SIN CONSULTAR A DARIO/DRAGANEL/NUCLEO000 ⚠️ * * Este endpoint fue creado para desarrollo y debugging. * Antes de eliminarlo, preguntar si todavía es necesario. */ import { exec } from 'child_process' import { promisify } from 'util' const execAsync = promisify(exec) export default defineEventHandler(async (event) => { try { console.log('💾 EXPORT DATABASE - Generando backup con pg_dump...') // Obtener credenciales de la base de datos const config = useRuntimeConfig() let host: string let port: string let database: string let user: string let password: string if (config.postgresUrl) { // Parsear la URL de conexión const url = new URL(config.postgresUrl) host = url.hostname port = url.port || '5432' database = url.pathname.slice(1) user = url.username password = url.password } else { // Fallback a variables de entorno const defaultHost = process.env.APP_NAME ? `${process.env.APP_NAME}-postgres` : 'postgres' host = process.env.POSTGRES_HOST || defaultHost port = process.env.POSTGRES_PORT || '5432' database = process.env.POSTGRES_DB || 'seguidor_lotes' user = process.env.POSTGRES_USER || 'seguidor' password = process.env.POSTGRES_PASSWORD || 'seguidor_password' } console.log(` - Host: ${host}`) console.log(` - Puerto: ${port}`) console.log(` - Base de datos: ${database}`) console.log(` - Usuario: ${user}`) // Generar timestamp para el nombre del archivo const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5) const filename = `backup-seguidordelotes-${timestamp}.sql` // Ejecutar pg_dump // Usar PGPASSWORD en la variable de entorno para evitar prompt de contraseña const command = `PGPASSWORD="${password}" pg_dump -h ${host} -p ${port} -U ${user} -d ${database} --clean --if-exists --no-owner --no-acl` console.log(' - Ejecutando pg_dump...') const { stdout, stderr } = await execAsync(command, { maxBuffer: 50 * 1024 * 1024, // 50MB buffer para backups grandes }) if (stderr && !stderr.includes('NOTICE')) { console.warn('⚠️ Advertencias de pg_dump:', stderr) } console.log('✅ Backup generado exitosamente') console.log(` - Tamaño: ${(stdout.length / 1024).toFixed(2)} KB`) // Establecer headers para descarga setResponseHeader(event, 'Content-Type', 'application/sql') setResponseHeader(event, 'Content-Disposition', `attachment; filename="${filename}"`) setResponseHeader(event, 'Content-Length', stdout.length.toString()) return stdout } catch (error: any) { console.error('❌ Error exportando base de datos:', error) // Si el error es porque pg_dump no está disponible if (error.message?.includes('pg_dump') && error.message?.includes('not found')) { throw createError({ statusCode: 500, statusMessage: 'pg_dump no está disponible', data: { message: 'El comando pg_dump no está disponible en el servidor. Asegúrate de que PostgreSQL client tools estén instalados.', }, }) } throw createError({ statusCode: 500, statusMessage: 'Error exportando base de datos', data: { message: error.message }, }) } })