Skip to content

Instantly share code, notes, and snippets.

@leodutra
Created April 16, 2018 15:35
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/5146183ce61e5a41edc93882504a7689 to your computer and use it in GitHub Desktop.
Save leodutra/5146183ce61e5a41edc93882504a7689 to your computer and use it in GitHub Desktop.
My Sequelize index.js for model association / transaction
'use strict'
const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const basename = path.basename(module.filename)
const config = require(__dirname + '/../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
// Proxy "db" to throw error on missing models
const proxiedDB = utils.proxyErrorOnMissingProperty(db)
module.exports = proxiedDB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment