Skip to content

Instantly share code, notes, and snippets.

@tthew
Created January 27, 2014 16:12
Show Gist options
  • Save tthew/8651471 to your computer and use it in GitHub Desktop.
Save tthew/8651471 to your computer and use it in GitHub Desktop.
var filesystem = require('fs');
var _ = require('lodash');
var models = {};
var relationships = {};
var orm = function orm() {
var Sequelize = require('sequelize');
var sequelize = null;
var modelsPath = '';
this.setup = function(path, database, username, password, obj) {
modelsPath = path;
if (arguments.length === 3) {
sequelize = new Sequelize(database, username);
} else if (arguments.length === 4) {
sequelize = new Sequelize(database, username, password);
} else if (arguments.length === 5) {
// _.extend(obj, {logging: console.log});
sequelize = new Sequelize(database, username, password, obj);
}
init();
return this;
};
this.model = function(name) {
return models[name];
};
this.Sequelize = function() {
return Sequelize;
};
this.getSequelize = function() {
return sequelize;
};
function init() {
filesystem.readdirSync(modelsPath).forEach(function(name) {
var object = require(modelsPath + '/' + name);
var options = object.options || {};
var modelName = name.replace(/\.js$/i, '');
// console.log('models[' + modelName + '] = sequelize.define(' + modelName + ',' + object.model + ',' + JSON.stringify(options) + ')');
models[modelName] = sequelize.define(modelName, object.model, options);
if ('relationships' in object) {
relationships[modelName] = object.relationships;
}
});
for (var name in relationships) {
var relation = relationships[name];
for (var relName in relation) {
var related = relation[relName];
if(Object.prototype.toString.call( relation[relName] ) === '[object Array]') {
for(var i=0; i < relation[relName].length; i++) {
if(Object.prototype.toString.call( relation[relName][i] ) === '[object String]') {
models[name][relName](models[relation[relName][i]] );
} else if (Object.prototype.toString.call(relation[relName][i]) === '[object Object]') {
// continue;
// console.log('models[' + name + '][' + relName + '](' + relation[relName][i].model + ',' + JSON.stringify(relation[relName][i].opts) + ')');
// console.log(relation[relName][i].opts);
models[name][relName](models[relation[relName][i].model], relation[relName][i].opts || null);
}
}
} else {
models[name][relName](models[related]);
}
}
}
}
if (orm.caller != orm.getInstance) {
throw new Error('This object cannot be instantiated');
}
};
orm.instance = null;
orm.getInstance = function() {
if (this.instance === null) {
this.instance = new orm();
}
return this.instance;
};
module.exports = orm.getInstance();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment