Created
April 16, 2018 15:35
-
-
Save leodutra/5146183ce61e5a41edc93882504a7689 to your computer and use it in GitHub Desktop.
My Sequelize index.js for model association / transaction
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(__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