appirio-tech/lc1-discussion-service

View on GitHub
api/models/index.js

Summary

Maintainability
B
5 hrs
Test Coverage
'use strict';

module.exports = function(config) {
  var fse = require('fs-extra');
  var path = require('path');
  var Sequelize = require('sequelize');
  var _ = require('lodash');

  // reading config.
  var postgresurl;

  // @TODO setup test heroku so we don't need this
  if (config.has('app.pgURLWercker')) {
    postgresurl = config.get('app.pgURLWercker');
  } else if (config.has('app.pgURL')) {
    postgresurl = config.get('app.pgURL');
  } else {
    postgresurl =  'postgres://' + config.get('app.pg.username') +
    ':' + config.get('app.pg.password') +
    '@' + config.get('app.pg.host') +
    ':' + config.get('app.pg.port') +
    '/' + config.get('app.pg.database');
  }

  var dbOptions = {};
  if (config.has('app.dbOptions')) {
    dbOptions = config.get('app.dbOptions');
  }

  var sequelize = new Sequelize(postgresurl, dbOptions);
  var db = {};

  // Add JSON and JSONB data type to Sequelize
  Sequelize.JSON = 'JSON';
  Sequelize.JSONB = 'JSONB';

  fse.readdirSync(__dirname).filter(function(file) {
    return ((file.indexOf('.' ) !== 0) && (file !== 'index.js') && (file.slice(-3) === '.js'));
  }).forEach(function(file) {
    var model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
  });

  Object.keys(db).forEach(function(modelName) {
    if (db[modelName].options.hasOwnProperty('associate')) {
      db[modelName].options.associate(db);
    }
  });
  return _.extend({sequelize: sequelize, Sequelize: Sequelize}, db);
};