213 lines
5.6 KiB
JavaScript
213 lines
5.6 KiB
JavaScript
const { initializeDatabase, resetDatabase, checkDatabaseStatus } = require('./databaseInit');
|
|
const { sequelize } = require('../config/database');
|
|
const logger = require('./logger');
|
|
|
|
// Import seeders
|
|
const createAdminUser = require('../seeders/001_create_admin_user');
|
|
const createSampleTrainingData = require('../seeders/002_create_sample_training_data');
|
|
|
|
const runMigrations = async () => {
|
|
try {
|
|
console.log('🔄 Running database migrations...');
|
|
|
|
// Import all migration files
|
|
const migrations = [
|
|
require('../migrations/001_create_users'),
|
|
require('../migrations/002_create_conversations'),
|
|
require('../migrations/003_create_plans'),
|
|
require('../migrations/004_create_messages'),
|
|
require('../migrations/005_create_documents'),
|
|
require('../migrations/006_create_feedback'),
|
|
require('../migrations/007_create_model_versions'),
|
|
require('../migrations/008_create_training_data'),
|
|
require('../migrations/009_create_tool_executions')
|
|
];
|
|
|
|
for (const migration of migrations) {
|
|
console.log(` Running migration: ${migration.up.name || 'unnamed'}`);
|
|
await migration.up(sequelize.getQueryInterface(), sequelize.constructor);
|
|
}
|
|
|
|
console.log('✅ All migrations completed successfully');
|
|
return true;
|
|
} catch (error) {
|
|
console.error('❌ Migration failed:', error);
|
|
logger.error('Migration error:', error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const runSeeders = async () => {
|
|
try {
|
|
console.log('🌱 Running database seeders...');
|
|
|
|
// Run seeders
|
|
await createAdminUser.up(sequelize.getQueryInterface(), sequelize.constructor);
|
|
await createSampleTrainingData.up(sequelize.getQueryInterface(), sequelize.constructor);
|
|
|
|
console.log('✅ All seeders completed successfully');
|
|
return true;
|
|
} catch (error) {
|
|
console.error('❌ Seeding failed:', error);
|
|
logger.error('Seeding error:', error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const setupDatabase = async (options = {}) => {
|
|
try {
|
|
console.log('🚀 Setting up database...');
|
|
|
|
const {
|
|
force = false,
|
|
seed = true,
|
|
migrations = true
|
|
} = options;
|
|
|
|
// Check database status
|
|
const status = await checkDatabaseStatus();
|
|
if (!status) {
|
|
throw new Error('Database connection failed');
|
|
}
|
|
|
|
// Run migrations if requested
|
|
if (migrations) {
|
|
const migrated = await runMigrations();
|
|
if (!migrated) {
|
|
throw new Error('Migrations failed');
|
|
}
|
|
}
|
|
|
|
// Run seeders if requested
|
|
if (seed) {
|
|
const seeded = await runSeeders();
|
|
if (!seeded) {
|
|
throw new Error('Seeding failed');
|
|
}
|
|
}
|
|
|
|
console.log('🎉 Database setup completed successfully!');
|
|
return true;
|
|
} catch (error) {
|
|
console.error('❌ Database setup failed:', error.message);
|
|
logger.error('Database setup error:', error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const getDatabaseInfo = async () => {
|
|
try {
|
|
console.log('📊 Database Information:');
|
|
|
|
// Get table information
|
|
const [results] = await sequelize.query(`
|
|
SELECT
|
|
schemaname,
|
|
tablename,
|
|
tableowner
|
|
FROM pg_tables
|
|
WHERE schemaname = 'public'
|
|
ORDER BY tablename;
|
|
`);
|
|
|
|
console.log(` Tables: ${results.length}`);
|
|
results.forEach(table => {
|
|
console.log(` - ${table.tablename}`);
|
|
});
|
|
|
|
// Get database size
|
|
const [sizeResult] = await sequelize.query(`
|
|
SELECT pg_size_pretty(pg_database_size(current_database())) as size;
|
|
`);
|
|
|
|
console.log(` Database size: ${sizeResult[0].size}`);
|
|
|
|
return {
|
|
tables: results,
|
|
size: sizeResult[0].size
|
|
};
|
|
} catch (error) {
|
|
console.error('❌ Error getting database info:', error);
|
|
return null;
|
|
}
|
|
};
|
|
|
|
const backupDatabase = async (backupPath) => {
|
|
try {
|
|
console.log('💾 Creating database backup...');
|
|
|
|
// This would typically use pg_dump in a real implementation
|
|
console.log(` Backup path: ${backupPath}`);
|
|
console.log(' Note: Implement actual backup logic with pg_dump');
|
|
|
|
return true;
|
|
} catch (error) {
|
|
console.error('❌ Backup failed:', error);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
// Command line interface
|
|
if (require.main === module) {
|
|
const args = process.argv.slice(2);
|
|
const command = args[0] || 'help';
|
|
|
|
const runCommand = async () => {
|
|
switch (command) {
|
|
case 'init':
|
|
await setupDatabase({ force: false, seed: true, migrations: true });
|
|
break;
|
|
case 'reset':
|
|
await resetDatabase();
|
|
break;
|
|
case 'migrate':
|
|
await runMigrations();
|
|
break;
|
|
case 'seed':
|
|
await runSeeders();
|
|
break;
|
|
case 'status':
|
|
await checkDatabaseStatus();
|
|
break;
|
|
case 'info':
|
|
await getDatabaseInfo();
|
|
break;
|
|
case 'backup':
|
|
const backupPath = args[1] || './backup.sql';
|
|
await backupDatabase(backupPath);
|
|
break;
|
|
case 'help':
|
|
default:
|
|
console.log(`
|
|
Database Manager Commands:
|
|
init - Initialize database with migrations and seeders
|
|
reset - Reset database (drop and recreate)
|
|
migrate - Run migrations only
|
|
seed - Run seeders only
|
|
status - Check database connection status
|
|
info - Show database information
|
|
backup - Create database backup
|
|
help - Show this help message
|
|
|
|
Usage: node databaseManager.js [command]
|
|
`);
|
|
break;
|
|
}
|
|
};
|
|
|
|
runCommand().then(() => {
|
|
process.exit(0);
|
|
}).catch(error => {
|
|
console.error('Command failed:', error);
|
|
process.exit(1);
|
|
});
|
|
}
|
|
|
|
module.exports = {
|
|
runMigrations,
|
|
runSeeders,
|
|
setupDatabase,
|
|
getDatabaseInfo,
|
|
backupDatabase
|
|
};
|