WebService-Boilerplate/models/index.js
2025-03-11 12:57:45 +07:00

88 lines
2.0 KiB
JavaScript

/**
* @file Database configuration and model initialization for Sequelize.
* Initializes the Sequelize ORM based on environment settings and loads database models.
* Provides access to the Sequelize instance and loaded models.
*/
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
/**
* Base filename of the current file
* @type {string}
*/
const basename = path.basename(__filename);
/**
* Current environment (development/production/test)
* @type {string}
*/
const env = process.env.NODE_ENV || 'development';
/**
* Database configuration for the current environment
* @type {Object}
*/
const config = require(__dirname + '/../config/config.js')[env];
/**
* Object containing all database models and Sequelize instances
* @type {Object}
*/
const db = {};
/**
* Sequelize instance for database connection
* @type {Sequelize}
*/
let sequelize;
// Initialize Sequelize with environment config or direct config
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
/**
* Load all model files from current directory and initialize them
*/
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf('.') !== 0 &&
file !== basename &&
file.slice(-3) === '.js' &&
file.indexOf('.test.js') === -1
);
})
.forEach(file => {
/**
* Initialize model from file
* @type {Sequelize.Model}
*/
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
/**
* Set up model associations if defined
*/
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
// Add Sequelize instances to db object
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;