Merge pull request #500 from getmaxun/auto-migrate

feat: automate db migrations
This commit is contained in:
Karishma Shukla
2025-03-27 16:16:36 +05:30
committed by GitHub
8 changed files with 188 additions and 1 deletions

View File

@@ -0,0 +1,42 @@
import dotenv from 'dotenv';
dotenv.config({ path: './.env' });
// Validate required environment variables
const requiredEnvVars = ['DB_USER', 'DB_PASSWORD', 'DB_NAME', 'DB_HOST', 'DB_PORT'];
requiredEnvVars.forEach(envVar => {
if (!process.env[envVar]) {
console.error(`Error: Environment variable ${envVar} is not set.`);
process.exit(1);
}
});
module.exports = {
development: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'postgres',
logging: console.log,
},
test: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'postgres',
logging: false,
},
production: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'postgres',
logging: false,
}
};

30
server/src/db/migrate.js Normal file
View File

@@ -0,0 +1,30 @@
'use strict';
import { execSync } from 'child_process';
import path from 'path';
import { fileURLToPath } from 'url';
import db from './models/index.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
async function runMigrations() {
try {
console.log('Testing database connection...');
await db.sequelize.authenticate();
console.log('Database connection established successfully.');
console.log('Running database migrations...');
execSync('npx sequelize-cli db:migrate', {
stdio: 'inherit',
cwd: path.resolve(__dirname, '../../..')
});
console.log('Migrations completed successfully');
return true;
} catch (error) {
console.error('Migration error:', error);
return false;
}
}
module.exports = runMigrations;

View File

@@ -0,0 +1,59 @@
'use strict';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import Sequelize from 'sequelize';
import databaseConfig from '../config/database.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = databaseConfig[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
try {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
console.log(`Connected to database using ${config.use_env_variable}`);
} catch (error) {
console.error('Unable to connect to the database using environment variable:', error);
process.exit(1);
}
} else {
try {
sequelize = new Sequelize(config.database, config.username, config.password, config);
console.log(`Connected to database: ${config.database}`);
} catch (error) {
console.error('Unable to connect to the database:', error);
process.exit(1);
}
}
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf('.') !== 0 &&
file !== basename &&
file.slice(-3) === '.js' &&
file.indexOf('.test.js') === -1
);
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;