#!/usr/bin/env node /** * Comprehensive Database Debugging Tool * * This tool provides detailed database diagnostics and troubleshooting * capabilities for the Shattered Void MMO. */ require('dotenv').config(); const DatabaseValidator = require('./database-validator'); // Color codes for console output const colors = { reset: '\x1b[0m', bright: '\x1b[1m', red: '\x1b[31m', green: '\x1b[32m', yellow: '\x1b[33m', blue: '\x1b[34m', magenta: '\x1b[35m', cyan: '\x1b[36m', white: '\x1b[37m' }; function log(level, message) { let colorCode = colors.white; let prefix = 'INFO'; switch (level) { case 'error': colorCode = colors.red; prefix = 'ERROR'; break; case 'warn': colorCode = colors.yellow; prefix = 'WARN'; break; case 'success': colorCode = colors.green; prefix = 'SUCCESS'; break; case 'info': colorCode = colors.cyan; prefix = 'INFO'; break; case 'debug': colorCode = colors.magenta; prefix = 'DEBUG'; break; } console.log(`${colors.bright}[${prefix}]${colors.reset} ${colorCode}${message}${colors.reset}`); } function displayBanner() { const banner = ` ${colors.cyan}╔═══════════════════════════════════════════════════════════════╗ ║ ║ ║ ${colors.bright}DATABASE DEBUGGING TOOL${colors.reset}${colors.cyan} ║ ║ ${colors.white}Comprehensive Database Diagnostics${colors.reset}${colors.cyan} ║ ║ ║ ╚═══════════════════════════════════════════════════════════════╝${colors.reset} `; console.log(banner); } async function runComprehensiveCheck() { try { displayBanner(); log('info', 'Starting comprehensive database diagnostics...'); const validator = new DatabaseValidator(); const results = await validator.validateDatabase(); // Display results in organized sections console.log('\n' + colors.bright + '='.repeat(60) + colors.reset); console.log(colors.bright + 'DATABASE VALIDATION RESULTS' + colors.reset); console.log(colors.bright + '='.repeat(60) + colors.reset); // Overall Status const overallStatus = results.success ? `${colors.green}✅ PASSED${colors.reset}` : `${colors.red}❌ FAILED${colors.reset}`; console.log(`\nOverall Status: ${overallStatus}`); console.log(`Validation Duration: ${results.duration}ms\n`); // Connectivity Check console.log(colors.cyan + '📡 CONNECTIVITY CHECK' + colors.reset); if (results.connectivity?.success) { log('success', 'Database connection established'); console.log(` Database: ${results.connectivity.database}`); console.log(` Host: ${results.connectivity.host}:${results.connectivity.port}`); console.log(` Version: ${results.connectivity.version}`); console.log(` Size: ${results.connectivity.size}`); console.log(` SSL: ${results.connectivity.ssl}`); console.log(` Pool: ${results.connectivity.pool.used}/${results.connectivity.pool.max} connections used`); } else { log('error', `Connection failed: ${results.connectivity?.error}`); if (results.connectivity?.troubleshooting) { console.log(colors.yellow + ' Troubleshooting tips:' + colors.reset); results.connectivity.troubleshooting.forEach(tip => console.log(` - ${tip}`) ); } } // Migration Check console.log('\n' + colors.cyan + '📦 MIGRATION STATUS' + colors.reset); if (results.migrations?.success) { log('success', 'All migrations are up to date'); console.log(` Current Batch: ${results.migrations.currentBatch}`); console.log(` Completed: ${results.migrations.completed} migrations`); console.log(` Pending: ${results.migrations.pending} migrations`); if (results.migrations.autoRan) { log('info', `Auto-ran ${results.migrations.autoRan} pending migrations`); } } else { log('error', `Migration check failed: ${results.migrations?.error}`); } // Schema Check console.log('\n' + colors.cyan + '🗂️ SCHEMA VALIDATION' + colors.reset); if (results.schema?.success) { log('success', 'All required tables exist'); console.log(` Coverage: ${results.schema.coverage}`); console.log(` Total Tables: ${results.schema.totalTables}`); // Table details console.log('\n Table Details:'); Object.entries(results.schema.tables).forEach(([tableName, info]) => { if (info.exists) { console.log(` ✅ ${tableName} (${info.columns} columns, ${info.rows} rows)`); } else { console.log(` ❌ ${tableName} - ${info.error}`); } }); // Optional tables if available if (results.schema.optionalTables) { console.log('\n Optional Tables:'); Object.entries(results.schema.optionalTables).forEach(([tableName, info]) => { console.log(` 📦 ${tableName} (${info.columns} columns, ${info.rows} rows)`); }); } } else { log('error', 'Schema validation failed'); if (results.schema?.missingTables?.length > 0) { console.log(` Missing tables: ${results.schema.missingTables.join(', ')}`); } if (results.schema?.troubleshooting) { console.log(colors.yellow + ' Troubleshooting tips:' + colors.reset); results.schema.troubleshooting.forEach(tip => console.log(` - ${tip}`) ); } } // Seed Data Check console.log('\n' + colors.cyan + '🌱 SEED DATA STATUS' + colors.reset); if (results.seeds?.success) { log('success', results.seeds.message); if (results.seeds.autoSeeded) { log('info', 'Seed data was automatically populated'); } Object.entries(results.seeds.checks).forEach(([checkName, check]) => { if (check.seeded) { console.log(` ✅ ${checkName}: ${check.count || 'OK'}`); } else { console.log(` ❌ ${checkName}: ${check.error || 'Not seeded'}`); } }); } else { log('error', `Seed data check failed: ${results.seeds?.error}`); } // Integrity Check console.log('\n' + colors.cyan + '🔒 DATA INTEGRITY' + colors.reset); if (results.integrity?.success) { log('success', results.integrity.summary); results.integrity.checks.forEach(check => { if (check.passed) { console.log(` ✅ ${check.name}: ${check.message}`); } else { console.log(` ❌ ${check.name}: ${check.error || 'Failed'}`); if (check.violations?.length > 0) { check.violations.forEach(violation => console.log(` - ${violation}`) ); } } }); } else { log('error', `Integrity check failed: ${results.integrity?.error}`); } // Final Summary console.log('\n' + colors.bright + '='.repeat(60) + colors.reset); console.log(colors.bright + 'DEBUGGING SUMMARY' + colors.reset); console.log(colors.bright + '='.repeat(60) + colors.reset); if (results.success) { log('success', '🎉 All database checks passed! Your database is ready.'); } else { log('error', '❌ Database validation failed. Please review the issues above.'); // Provide actionable steps console.log('\n' + colors.yellow + 'Recommended Actions:' + colors.reset); if (!results.connectivity?.success) { console.log('1. Fix database connectivity issues first'); } if (!results.migrations?.success) { console.log('2. Run database migrations: npm run db:migrate'); } if (!results.schema?.success) { console.log('3. Ensure all required tables exist by running migrations'); } if (!results.seeds?.success) { console.log('4. Populate seed data: npm run db:seed'); } if (!results.integrity?.success) { console.log('5. Review and fix data integrity issues'); } } console.log(''); } catch (error) { log('error', `Debugging tool failed: ${error.message}`); console.error(error.stack); process.exit(1); } } // Command line interface const command = process.argv[2]; switch (command) { case 'check': case undefined: runComprehensiveCheck(); break; case 'help': console.log(` Database Debugging Tool Usage: node scripts/debug-database.js [command] Commands: check (default) Run comprehensive database diagnostics help Show this help message Examples: node scripts/debug-database.js node scripts/debug-database.js check `); break; default: log('error', `Unknown command: ${command}`); log('info', 'Use "help" for available commands'); process.exit(1); }