require('dotenv').config(); const connectDB = require('../config/database'); const migrationHelper = require('../utils/migrationHelper'); const path = require('path'); const fs = require('fs'); /** * Tự động phát hiện tất cả các file script trong thư mục scripts * Loại trừ các file quản lý migration và file không phải .js */ function discoverMigrations() { const scriptsDir = __dirname; const files = fs.readdirSync(scriptsDir); // Danh sách các file quản lý migration cần loại trừ const excludeFiles = [ 'migrate-all.js', 'migrate-status.js', 'migrate-rollback.js', 'migrate-fresh.js', 'make-migration.js', 'MIGRATION_README.md' ]; const migrations = files .filter(file => { // Lấy tất cả file .js, trừ các file quản lý return file.endsWith('.js') && !excludeFiles.includes(file); }) .map(file => file.replace('.js', '')) .sort(); return migrations; } // Tự động phát hiện migrations const availableMigrations = discoverMigrations(); /** * Hiển thị trạng thái của tất cả migrations */ async function showStatus() { const mongoose = require('mongoose'); let ownConn = false; try { const wasConnected = mongoose.connection.readyState === 1; await connectDB(); if (!wasConnected) ownConn = true; console.log('\nMigration Status:\n'); const ranMigrations = await migrationHelper.getRanMigrations(); const ranMap = new Map(); ranMigrations.forEach(m => ranMap.set(m.name, m)); // Tính toán độ rộng cột const maxNameLength = Math.max(...availableMigrations.map(name => name.length), 20); const statusWidth = 10; const batchWidth = 6; const ranAtWidth = 20; const totalWidth = maxNameLength + statusWidth + batchWidth + ranAtWidth + 11; // 11 = spaces and separators // Header console.log('='.repeat(totalWidth)); console.log( `${'Migration Name'.padEnd(maxNameLength)} | ${'Status'.padEnd(statusWidth)} | ${'Batch'.padEnd(batchWidth)} | Ran At` ); console.log('='.repeat(totalWidth)); let pendingCount = 0; let ranCount = 0; for (const migrationName of availableMigrations) { const migration = ranMap.get(migrationName); if (migration) { const ranAt = new Date(migration.ranAt).toLocaleString('vi-VN'); console.log( `${migrationName.padEnd(maxNameLength)} | ${'Ran'.padEnd(statusWidth)} | ${String(migration.batch).padEnd(batchWidth)} | ${ranAt}` ); ranCount++; } else { console.log( `${migrationName.padEnd(maxNameLength)} | ${'Pending'.padEnd(statusWidth)} | ${'-'.padEnd(batchWidth)} | -` ); pendingCount++; } } console.log('='.repeat(totalWidth)); console.log(`\nSummary:`); console.log(` Ran: ${ranCount} migration(s)`); console.log(` Pending: ${pendingCount} migration(s)`); const lastBatch = await migrationHelper.getLastBatch(); if (lastBatch > 0) { console.log(` Last batch: ${lastBatch}`); } console.log(''); if (ownConn && mongoose.connection.readyState === 1) { await mongoose.disconnect(); } } catch (error) { console.error('Error:', error.message); if (ownConn && mongoose.connection.readyState === 1) { await mongoose.disconnect(); } process.exit(1); } } // Chạy nếu được gọi trực tiếp if (require.main === module) { showStatus(); } module.exports = { showStatus };