codenuk_backend_mine/services/ai-mockup-service/src/migrations/migrate.js
2025-09-30 16:27:32 +05:30

109 lines
3.3 KiB
JavaScript

require('dotenv').config();
const fs = require('fs');
const path = require('path');
const database = require('../config/database');
async function createMigrationsTable() {
await database.query(`
CREATE TABLE IF NOT EXISTS schema_migrations (
id SERIAL PRIMARY KEY,
version VARCHAR(255) NOT NULL UNIQUE,
service VARCHAR(100) NOT NULL,
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
description TEXT
)
`);
}
async function isMigrationApplied(version) {
const result = await database.query(
'SELECT 1 FROM schema_migrations WHERE version = $1 AND service = $2',
[version, 'ai-mockup-service']
);
return result.rows.length > 0;
}
async function markMigrationApplied(version, description) {
await database.query(
'INSERT INTO schema_migrations (version, service, description) VALUES ($1, $2, $3) ON CONFLICT (version) DO NOTHING',
[version, 'ai-mockup-service', description]
);
}
async function runMigrations() {
console.log('🚀 Starting AI Mockup Service database migrations...');
const migrations = [
{
file: '001_wireframe_schema.sql',
version: '001_wireframe_schema',
description: 'Create wireframe-related tables'
}
];
try {
// Ensure required extensions exist before running migrations
console.log('🔧 Ensuring required PostgreSQL extensions...');
await database.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";');
console.log('✅ Extensions ready');
// Create migrations tracking table
await createMigrationsTable();
console.log('✅ Migration tracking table ready');
let appliedCount = 0;
let skippedCount = 0;
for (const migration of migrations) {
const migrationPath = path.join(__dirname, migration.file);
if (!fs.existsSync(migrationPath)) {
console.warn(`⚠️ Migration file ${migration.file} not found, skipping...`);
continue;
}
// Check if migration was already applied
if (await isMigrationApplied(migration.version)) {
console.log(`⏭️ Migration ${migration.file} already applied, skipping...`);
skippedCount++;
continue;
}
const migrationSQL = fs.readFileSync(migrationPath, 'utf8');
console.log(`📄 Running migration: ${migration.file}`);
await database.query(migrationSQL);
await markMigrationApplied(migration.version, migration.description);
console.log(`✅ Migration ${migration.file} completed!`);
appliedCount++;
}
console.log(`📊 Migration summary: ${appliedCount} applied, ${skippedCount} skipped`);
// Verify all tables
const result = await database.query(`
SELECT
schemaname,
tablename,
tableowner
FROM pg_tables
WHERE schemaname = 'public'
AND tablename IN ('wireframes', 'wireframe_versions', 'wireframe_elements')
ORDER BY tablename
`);
console.log('🔍 Verified tables:');
result.rows.forEach(row => {
console.log(` - ${row.tablename}`);
});
console.log('✅ AI Mockup Service migrations completed successfully!');
process.exit(0);
} catch (error) {
console.error('❌ Migration failed:', error.message);
console.error('📚 Error details:', error);
process.exit(1);
}
}
runMigrations();