remove sync alter true, add pending migration check

This commit is contained in:
jackiettran
2025-11-25 17:53:49 -05:00
parent 8fc269c62a
commit 9ec3e97d9e
3 changed files with 115 additions and 5 deletions

View File

@@ -353,8 +353,8 @@ async function main() {
const command = args[0]; const command = args[0];
try { try {
// Sync database // Verify database connection
await sequelize.sync(); await sequelize.authenticate();
if (!command || command === "help") { if (!command || command === "help") {
console.log(` console.log(`

View File

@@ -165,10 +165,23 @@ app.use(sanitizeError);
const PORT = process.env.PORT || 5000; const PORT = process.env.PORT || 5000;
const { checkPendingMigrations } = require("./utils/checkMigrations");
sequelize sequelize
.sync({ alter: true }) .authenticate()
.then(async () => { .then(async () => {
logger.info("Database synced successfully"); logger.info("Database connection established successfully");
// Check for pending migrations
const pendingMigrations = await checkPendingMigrations(sequelize);
if (pendingMigrations.length > 0) {
logger.error(
`Found ${pendingMigrations.length} pending migration(s). Please run 'npm run db:migrate'`,
{ pendingMigrations }
);
process.exit(1);
}
logger.info("All migrations are up to date");
// Initialize email services and load templates // Initialize email services and load templates
try { try {
@@ -209,8 +222,9 @@ sequelize
}); });
}) })
.catch((err) => { .catch((err) => {
logger.error("Unable to sync database", { logger.error("Unable to connect to database", {
error: err.message, error: err.message,
stack: err.stack, stack: err.stack,
}); });
process.exit(1);
}); });

View File

@@ -0,0 +1,96 @@
const fs = require("fs");
const path = require("path");
/**
* Check for pending database migrations
*
* Compares migration files in the filesystem against the SequelizeMeta table
* to determine which migrations have not yet been executed.
*
* @param {Sequelize} sequelize - Sequelize instance
* @returns {Promise<string[]>} Array of pending migration filenames
*/
async function checkPendingMigrations(sequelize) {
const migrationsPath = path.resolve(__dirname, "..", "migrations");
// Get all migration files from filesystem
const migrationFiles = fs
.readdirSync(migrationsPath)
.filter((file) => file.endsWith(".js"))
.sort();
// Check if SequelizeMeta table exists
const [results] = await sequelize.query(`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'SequelizeMeta'
) as exists
`);
if (!results[0].exists) {
// No migrations have ever been run
return migrationFiles;
}
// Get executed migrations from SequelizeMeta
const [executedMigrations] = await sequelize.query(
'SELECT name FROM "SequelizeMeta" ORDER BY name'
);
const executedSet = new Set(executedMigrations.map((row) => row.name));
// Find migrations that haven't been executed
const pendingMigrations = migrationFiles.filter(
(file) => !executedSet.has(file)
);
return pendingMigrations;
}
/**
* Get migration status summary
*
* @param {Sequelize} sequelize - Sequelize instance
* @returns {Promise<{executed: string[], pending: string[]}>} Migration status
*/
async function getMigrationStatus(sequelize) {
const migrationsPath = path.resolve(__dirname, "..", "migrations");
const migrationFiles = fs
.readdirSync(migrationsPath)
.filter((file) => file.endsWith(".js"))
.sort();
// Check if SequelizeMeta table exists
const [results] = await sequelize.query(`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'SequelizeMeta'
) as exists
`);
if (!results[0].exists) {
return {
executed: [],
pending: migrationFiles,
};
}
const [executedMigrations] = await sequelize.query(
'SELECT name FROM "SequelizeMeta" ORDER BY name'
);
const executedSet = new Set(executedMigrations.map((row) => row.name));
return {
executed: migrationFiles.filter((file) => executedSet.has(file)),
pending: migrationFiles.filter((file) => !executedSet.has(file)),
};
}
module.exports = {
checkPendingMigrations,
getMigrationStatus,
};