@accounter/server
Version:
Accounter GraphQL server
43 lines • 1.78 kB
JavaScript
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