caradoc-entity
Version:
entity managment for caradoc framework
307 lines (277 loc) • 10.1 kB
JavaScript
var connection = require('caradoc-sql');
var path = require('path');
var fs = require('fs');
var event = require('events').EventEmitter;
var util = require('util');
/**
*
* @param {String} objectName
* @constructor
*/
function Find (objectName){
var entity = require('caradoc-entity');
var Object = new entity.generate[objectName]();
var self = this;
event.call(self);
/**
*
* @param {Object}join
* @param {function(Object, Object, Object)} callback
*/
this['getAll'] = function(join, callback){
if(join){
}
else{
var queryAll = 'SELECT * FROM '+ objectName ;
connection.query(queryAll, function(err, rows, field){
if(err){
if(!callback) self.emit('error', err);
else callback(err, null, null);
}
if(rows && field){
if(!callback){self.emit('rows', rows); self.emit('field', field);}
else{callback(null,rows, field); }
}
else{
if(rows){
if(!callback) self.emit('rows', rows);
else callback(null,rows, null);
}
else
if(field){
if(!callback) self.emit('field', field);
else callback(null, null, field);
}
}
});
}
};
/*
* find(object).ByX(value)
*
*
*/
//console.log(Object);
for(var key in Object){
var query = 'SELECT * FROM user WHERE ' + key + "=\'";
if (((key.toString().toLowerCase() != "params")
&& (key.toString().toLowerCase() != "inheritfrom")
&& (key.toString().toLowerCase() != "entityname"))) {
(function(insideQuery, obj){
addMethod("getBy" + key.charAt(0).toUpperCase() + key.slice(1), obj, function(args, callback) {
insideQuery+= args + "\'";
console.log(insideQuery);
connection.query(insideQuery, function(err, rows , field){
if(err){
if(!callback) self.emit('error', err);
else callback(err);
}
if(rows && field){
if(!callback){self.emit('rows', rows); self.emit('field', field);}
else{callback(null,rows, field); }
}
else{
if(rows){
if(!callback) self.emit('rows', rows);
else callback(null,rows);
}
if(field){
if(!callback) self.emit('field', field);
else callback(null, null, field);
}
}
});
});
})(query, this);
}
}
/*
* find () .by
* args = {
* where :{
* value1 : value ,
* value2 : value
* },
* order :{
* value1 :ASC/DESC
* }
* limit :{
* offset : X ,
* ligne : X
* }
*
*/
this['getBy'] = function(args, callback) {
var query = "SELECT * FROM " + objectName ;
var compteur = 0;
var whereQuery = '';
var orderQuery = '';
var limitQuery = '';
for(var value in args) {
if (value.toString().toLowerCase() == 'where') {
whereQuery+= " WHERE (";
for(var subValue in args[value]){
if(compteur == 0) {
whereQuery += subValue + "=" + "\'" + args[value][subValue] + "\' ";
compteur++;
}
else {
whereQuery += " && " + subValue + "=" + "\'" + args[value][subValue] + "\' ";
}
}
whereQuery += ")";
}
if(value.toString().toLowerCase() == 'order') {
orderQuery += " ORDER BY ";
for(var subValue in args[value]){
orderQuery += " " + subValue + " " + args[value][subValue];
}
}
if(value.toString().toLowerCase() == 'limit') {
limitQuery += " LIMIT ";
for(var subValue in args[value]){
orderQuery += " " + args[value]['offset'] + "," + args[value]['ligne'];
}
}
}
query += whereQuery + orderQuery + limitQuery;
console.log(query);
/**
* @param {String} query
* @param {function(Object, Object, Object)}
*/
connection.query(query, function(err, rows , field){
if(err){
if(!callback) self.emit('error', err);
else callback(err);
}
if(rows && field){
if(!callback){self.emit('rows', rows); self.emit('field', field);}
else{callback(null,rows, field); }
}
else{
if(rows){
if(!callback) self.emit('rows', rows);
else callback(null,rows);
}
if(field){
if(!callback) self.emit('field', field);
else callback(null, null, field);
}
}
});
};
/*
* find () .oneBy
* args = {
* where :{
* value1 : value ,
* value2 : value
* }
*/
this['getOneBy'] = function(args, callback) {
var query = "SELECT * FROM " + objectName ;
var compteur = 0;
var whereQuery = '';
var orderQuery = '';
var limitQuery = '';
for(var value in args) {
if (value.toString().toLowerCase() == 'where') {
whereQuery+= " WHERE (";
for(var subValue in args[value]){
if(compteur == 0) {
whereQuery += subValue + "=" + "\'" + args[value][subValue] + "\' ";
compteur++;
}
else {
whereQuery += " && " + subValue + "=" + "\'" + args[value][subValue] + "\' ";
}
}
whereQuery += ")";
}
if(value.toString().toLowerCase() == 'limit') {
limitQuery += " LIMIT 0,1";
}
}
query += whereQuery + orderQuery + limitQuery;
console.log(query);
connection.query(query, function(err, rows, field){
if(err){
if(!callback) self.emit('error', err);
else callback(err);
}
if(rows && field){
if(!callback){self.emit('rows', rows); self.emit('field', field);}
else{callback(null,rows, field); }
}
else{
if(rows){
if(!callback) self.emit('rows', rows);
else callback(null,rows);
}
if(field){
if(!callback) self.emit('field', field);
else callback(null, null, field);
}
}
});
};
/*
* add custom queries
*
*
*
*/
var bundle = require('../../../config/routes').get;
var entityFound = {};
for(var key in bundle){
(function(currentKey, obj){
var src = path.resolve(__dirname,"../../../src/"+bundle[currentKey].name+"/entityRepo/");
if(fs.existsSync(src)){
var list = fs.readdirSync(src);
for (var i in list){
var file = list[i].split('.'); // return the file name without the extension
if(file[0].toString().toLowerCase() == objectName.toString().toLowerCase())
entityFound[file[0]] = require(src+'/'+list[i]); //add the give entity to the find method
for(var newKey in entityFound['user']){
var fn = entityFound['user'];
addMethod(newKey, obj ,function(args, callback){
var query = fn[newKey](args);
connection.query(query, function(err, rows , field){
if(err){
if(!callback) self.emit('error', err);
else callback(err);
}
if(rows && field){
if(!callback){self.emit('rows', rows); self.emit('field', field);}
else{callback(null,rows, field); }
}
else{
if(rows){
if(!callback) self.emit('rows', rows);
else callback(null,rows);
}
if(field){
if(!callback) self.emit('field', field);
else callback(null, null, field);
}
}
});
});
}
}
}
})(key, this);
}
}
util.inherits(Find, event);
exports.find = Find;
/**
*
* @param { String} key
* @param { Object } obj
* @param { function(object, object, object)} fn
*/
function addMethod(key, obj, fn){
obj[key] = fn;
}