UNPKG

@accounter/server

Version:
43 lines 1.78 kB
import { createPool as createSlonikPool } from 'slonik'; import { testDbConfig, testDbSchema } from './test-db-config.js'; import { runPGMigrations, LATEST_MIGRATION_NAME } from '../../../../migrations/src/run-pg-migrations.js'; import { debugLog, emitMetrics } from './diagnostics.js'; import { TestDbMigrationError } from './errors.js'; export async function runMigrationsIfNeeded(pgPool) { let needToRun = false; const client = await pgPool.connect(); try { const existsRes = await client.query('SELECT to_regclass($1) as reg', [`${testDbSchema}.migration`]); const tableExists = Boolean(existsRes.rows?.[0]?.reg); if (!tableExists) { needToRun = true; } else if (LATEST_MIGRATION_NAME) { const latestExists = await client.query(`SELECT 1 FROM ${testDbSchema}.migration WHERE name = $1 LIMIT 1`, [LATEST_MIGRATION_NAME]); needToRun = latestExists.rowCount === 0; } } catch (err) { needToRun = true; debugLog('Migration state check failed, will attempt to run migrations'); } finally { client.release(); } if (!needToRun) { debugLog('Migrations appear up-to-date; skipping run'); return; } const slonikPool = await createSlonikPool(`postgres://${testDbConfig.user}:${testDbConfig.password}@${testDbConfig.host}:${testDbConfig.port}/${testDbConfig.database}`, { statementTimeout: 10 * 60 * 1000 }); try { await runPGMigrations({ slonik: slonikPool }); emitMetrics('migrations-ran', pgPool); } catch (err) { throw new TestDbMigrationError('Failed to run migrations', err); } finally { await slonikPool.end(); } } //# sourceMappingURL=db-migrations.js.map