Shatteredvoid/scripts/debug-database.js
MegaProxy e681c446b6 feat: implement comprehensive startup system and fix authentication
Major improvements:
- Created startup orchestration system with health monitoring and graceful shutdown
- Fixed user registration and login with simplified authentication flow
- Rebuilt authentication forms from scratch with direct API integration
- Implemented comprehensive debugging and error handling
- Added Redis fallback functionality for disabled environments
- Fixed CORS configuration for cross-origin frontend requests
- Simplified password validation to 6+ characters (removed complexity requirements)
- Added toast notifications at app level for better UX feedback
- Created comprehensive startup/shutdown scripts with OODA methodology
- Fixed database validation and connection issues
- Implemented TokenService memory fallback when Redis is disabled

Technical details:
- New SimpleLoginForm.tsx and SimpleRegisterForm.tsx components
- Enhanced CORS middleware with additional allowed origins
- Simplified auth validators and removed strict password requirements
- Added extensive logging and diagnostic capabilities
- Fixed authentication middleware token validation
- Implemented graceful Redis error handling throughout the stack
- Created modular startup system with configurable health checks

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-03 12:53:25 +00:00

273 lines
9.1 KiB
JavaScript
Executable file

#!/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);
}