Created
May 16, 2018 06:59
-
-
Save leodutra/566d6957c95af1485be4824be18a7a6c to your computer and use it in GitHub Desktop.
Enhanced Sequelize Models index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict' | |
const fs = require('fs') | |
const path = require('path') | |
const Sequelize = require('sequelize') | |
const basename = path.basename(module.filename) | |
const config = require('../config') | |
const env = config.NODE_ENV | |
const envConfig = config[env] // environment specific configs | |
const _ = require('lodash') | |
const db = {} | |
const cls = require('cls-hooked') // FIXME using cls-hooked while cls does not support async hooks | |
const sequelizeReadonlyPlugin = require('sequelize-noupdate-attributes') | |
const rimraf = require('rimraf') | |
const utils = require('../utils') | |
if (env === 'development' && envConfig.storage) { | |
//rimraf.sync(envConfig.storage) | |
const sqlite = require('sqlite3') | |
new sqlite.Database(envConfig.storage) | |
} | |
// CLS =========================================================================== | |
const clsNamespace = cls.createNamespace(config.sequelize.clsNamespace) | |
Sequelize.useCLS(clsNamespace) | |
// SEQUELIZE INSTANCE ============================================================ | |
let sequelize | |
if (envConfig.use_env_variable) { | |
console.log('Using env variable for database.') | |
const databaseURI = utils.requireEnv(envConfig.use_env_variable) | |
console.log('Database URI:', databaseURI) | |
sequelize = new Sequelize(databaseURI, { ...config.sequelize }) | |
} else { | |
console.log('Using database config:\n', { ...envConfig, ...config.sequelize }) | |
sequelize = new Sequelize({ ...envConfig, ...config.sequelize }) | |
} | |
sequelizeReadonlyPlugin(sequelize) | |
// MODELS ======================================================================== | |
const pascalCase = str => _.upperFirst(_.camelCase(str)) | |
fs | |
.readdirSync(__dirname) | |
.filter(file => file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js') | |
.forEach(file => { | |
const model = sequelize.import(path.join(__dirname, file)) | |
db[pascalCase(model.name)] = model | |
}) | |
Object.keys(db).forEach(modelName => { | |
if (db[modelName].associate) { | |
db[modelName].associate(db) | |
} | |
}) | |
async function transaction(task) { // NOTE SQLITE can have only 1 active transaction | |
return clsNamespace.get('transaction') ? task() : sequelize.transaction(task) | |
} | |
db.sequelize = sequelize | |
db.Sequelize = Sequelize | |
db.clsNamespace = clsNamespace | |
db.transaction = transaction | |
db.Op = sequelize.Op | |
module.exports = db |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment