#!/usr/bin/env node // Run all Postgres-compatible migrations in order. // Each migration is idempotent (safe to re-run). // Used by CI/CD pipeline during deploy to ensure schema is up to date. // // Usage: cd backend && node migrations/run-all.js const { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); const MIGRATIONS_DIR = __dirname; // Only run migrations that use the Postgres pool (not legacy SQLite ones). // Add new migrations to this list as they're created. const POSTGRES_MIGRATIONS = [ 'add_decom_workflow_type.js', 'add_fp_submissions_dismissed.js', 'add_fp_submissions_requeued_at.js', 'add_vcl_reporting_columns.js', 'add_vcl_vertical_metadata.js', 'add_vcl_multi_vertical.js', 'add_compliance_item_history.js', 'add_jira_sync_columns_pg.js', 'add_flexible_jira_ticket_creation.js', 'add_multi_item_jira_ticket.js', 'drop_jira_status_check_constraint.js', 'add_compliance_history_metric_id.js', ]; async function runAll() { console.log(`[Migrations] Running ${POSTGRES_MIGRATIONS.length} Postgres migration(s)...`); let succeeded = 0; let failed = 0; for (const file of POSTGRES_MIGRATIONS) { const fullPath = path.join(MIGRATIONS_DIR, file); if (!fs.existsSync(fullPath)) { console.error(` [FAIL] ${file}: file not found`); failed++; continue; } try { console.log(` [run] ${file}`); execSync(`node ${fullPath}`, { cwd: path.join(MIGRATIONS_DIR, '..'), stdio: 'inherit', timeout: 30000, }); succeeded++; } catch (err) { console.error(` [FAIL] ${file}: exit code ${err.status}`); failed++; } } console.log(`[Migrations] Done: ${succeeded} applied, ${failed} failed`); if (failed > 0) process.exit(1); } runAll();