Skip to content

Instantly share code, notes, and snippets.

@leodutra
Created May 16, 2018 06:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leodutra/566d6957c95af1485be4824be18a7a6c to your computer and use it in GitHub Desktop.
Save leodutra/566d6957c95af1485be4824be18a7a6c to your computer and use it in GitHub Desktop.
Enhanced Sequelize Models index.js
'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