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>
This commit is contained in:
parent
d41d1e8125
commit
e681c446b6
36 changed files with 7719 additions and 183 deletions
273
scripts/debug-database.js
Executable file
273
scripts/debug-database.js
Executable file
|
|
@ -0,0 +1,273 @@
|
|||
#!/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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue