2
0
Fork 0

WIP open file for a while

This commit is contained in:
Willem 2017-06-10 16:53:29 +02:00
parent f937019e42
commit d280fb9af3
122 changed files with 5702 additions and 10 deletions

247
lib/backend/database.js Normal file
View file

@ -0,0 +1,247 @@
var tcrudSetup = require('./../tcrud-setup');
var debug = require('debug')('ff:tcrud:backend:database');
module.exports = {
loadModule: function(key,dbModule) {
tcrudSetup.pluginLoad(new DatabasePlugin(key,dbModule));
},
loadPostgres: function(key,dbUri,pgDB,pgDBNamed) {
tcrudSetup.pluginLoad(new DatabasePlugin(key,new PostgresModule(dbUri,pgDB,pgDBNamed)));
},
loadMysql2: function(key,pool) {
tcrudSetup.pluginLoad(new DatabasePlugin(key,new Mysql2Module(pool)));
},
loadMssql: function(key,driver,conn) {
tcrudSetup.pluginLoad(new DatabasePlugin(key,new MssqlModule(driver,conn)));
}
}
//------- PostgresModule Object
function PostgresModule(dbUri,pgDB,pgDBNamed) {
this.dbUri = dbUri;
this.pgDB = pgDB;
this.pgDBNamed = pgDBNamed;
}
PostgresModule.prototype.query = function(sqlQuery,params, cb) {
var self = this;
self.pgDB.connect(self.dbUri, function(err, client, done) {
self.pgDBNamed.patch(client);
client.query(sqlQuery, params, function(err, result) {
done(); // release client from pool
cb(err,result);
});
});
}
function Mysql2Module(pool) {
this.pool = pool;
}
Mysql2Module.prototype.query = function(sqlQuery,params, cb) {
var self = this;
self.pool.getConnection(function(err, connection) {
connection.config.namedPlaceholders = true;
connection.execute(sqlQuery,params, function(err, rows) {
connection.release();
cb(err,rows);
});
});
}
function MssqlModule(driver,conn) {
this.driver = driver;
this.conn = conn;
}
MssqlModule.prototype.query = function(sqlQuery,params, cb) {
var self = this;
var request = new self.driver.Request(self.conn);
request.query(sqlQuery,params,function(err, rows) {
cb(err,rows);
});
}
//------- DatabasePlugin Object
function DatabasePlugin(key,dbModule) {
this.key = key;
this.dbModule = dbModule;
}
DatabasePlugin.prototype.configPlugin = function (ctx) {
ctx.key='db#'+this.key;
ctx.description='Database api adapter for '+this.key;
};
DatabasePlugin.prototype.createBackend = function() {
return new DatabaseBackend(this);
}
DatabasePlugin.prototype.query = function(sqlQuery,params, cb) {
this.dbModule.query(sqlQuery,params,cb);
}
// -------- DatabaseBackend
function findKeysView(tview) {
return tview.tkeys;
}
function findKeysModel(tview) {
return tview.tmeta.tmodel.tkeys;
}
function selectField(tview,crudType) {
var result = [];
tview[crudType].tfields.forEach(function (tfieldKey) {
var tfield = tview.tmeta.tfields[tfieldKey];
result.push(tfield.tid);
});
var resultSql = '';
for (var i = 0; i < result.length; i++) {
var key = result[i];
resultSql += key;
if (i < (result.length - 1)) {
resultSql += ',';
}
}
return resultSql;
}
function whereKeys(tview) {
var resultSql = '';
for (var i = 0; i < tview.tmeta.tmodel.tkeys.length; i++) {
var key = tview.tmeta.tmodel.tkeys[i];
//resultSql += key +' = $'+(i+1);
resultSql += key +' = $'+key;
if (i < (tview.tmeta.tmodel.tkeys.length - 1)) {
resultSlug += ' AND ';
}
}
return resultSql;
}
function updateValues(tview,data) {
var resultSql = 'SET ';
var dataKeys = Object.keys(data);
for (var i = 0; i < dataKeys.length; i++) {
var key = dataKeys[i];
var skip = false;
for (var ii = 0; ii < tview.tmeta.tmodel.tkeys.length; ii++) {
var keyPK = tview.tmeta.tmodel.tkeys[ii];
if (key === keyPK) {
skip = true;
break;
}
}
if (skip === true) {
continue;
}
resultSql += key +' = $'+key;
if (i < (dataKeys.length - 1)) {
resultSql += ',';
}
}
return resultSql;
}
function DatabaseBackend(plugin) {
this.plugin = plugin;
}
DatabaseBackend.prototype.getKey = function() {
return this.plugin.key;
}
DatabaseBackend.prototype.findAll = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+'';
debug('findAll %s',querySql);
var query = self.plugin.query(querySql,[],function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows);
}
});
};
}
DatabaseBackend.prototype.createNew = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
};
}
DatabaseBackend.prototype.findOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview)+'';
debug('findOne param %s',JSON.stringify(dataParam));
debug('findOne sql %s',querySql);
var query = self.plugin.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
DatabaseBackend.prototype.updateOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'UPDATE '+tview.tmeta.tmodel.tid+' '+updateValues(tview,data)+' WHERE '+whereKeys(tview);
debug('updateOne param %s',JSON.stringify(dataParam));
debug('updateOne data %s',JSON.stringify(data));
debug('updateOne sql %s',querySql);
var query = self.plugin.query(querySql, data, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
DatabaseBackend.prototype.deleteOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'DELETE FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
debug('deleteOne param %s',JSON.stringify(dataParam));
debug('deleteOne sql %s',querySql);
var query = self.plugin.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
DatabaseBackend.prototype.findAllCount = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT count(*) FROM '+tview.tmeta.tmodel.tid; //+' WHERE '+whereKeys(tview);
debug('findAllCount param %s',JSON.stringify(dataParam));
debug('findAllCount sql %s',querySql);
var query = self.plugin.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}

150
lib/backend/ldapjs.js Normal file
View file

@ -0,0 +1,150 @@
var config = require('./../tcrud-config');
var debug = require('debug')('ff:tcrud:ldapjs');
module.exports = {
registrate: function(key,client) {
config.registratePlugin(new LdapJSPlugin(key,client));
}
}
// ------- LdapJSPlugin Object
function LdapJSPlugin(key,client) {
this.key = key;
this.client = client;
}
LdapJSPlugin.prototype.configPlugin = function (ctx) {
ctx.key='ldapjs#'+this.key;
ctx.description='Adds ldap backend support.';
};
LdapJSPlugin.prototype.createBackend = function() {
return new LdapJSBackend(this);
}
// -------- LdapJSBackend Object
function LdapJSBackend(plugin) {
this.plugin = plugin;
}
LdapJSBackend.prototype.getKey = function() {
return this.plugin.key;
}
LdapJSBackend.prototype.findAll = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var opts = {
filter: '(&(l=Seattle)(email=*@foo.com))',
scope: 'sub'
};
debug('findAll %s',opts);
self.plugin.client.search('o=example', opts, function(err, res) {
if (err) {
debug(err);
cb(err);
return;
}
//var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+'';
var result = [];
res.on('searchEntry', function(entry) {
result.push(entry);
});
res.on('end', function(result) {
cb(err,result);
});
});
};
}
LdapJSBackend.prototype.createNew = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var entry = {
cn: 'foo',
sn: 'bar',
email: ['foo@bar.com', 'foo1@bar.com'],
objectclass: 'fooPerson'
};
self.plugin.client.add('cn=foo, o=example', entry, function(err) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows);
}
});
};
}
LdapJSBackend.prototype.findOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview)+'';
debug('findOne param %s',JSON.stringify(dataParam));
debug('findOne sql %s',querySql);
var query = self.db.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
LdapJSBackend.prototype.updateOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'UPDATE '+tview.tmeta.tmodel.tid+' '+updateValues(tview,data)+' WHERE '+whereKeys(tview);
debug('updateOne param %s',JSON.stringify(dataParam));
debug('updateOne data %s',JSON.stringify(data));
debug('updateOne sql %s',querySql);
var query = self.db.query(querySql, data, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
LdapJSBackend.prototype.deleteOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'DELETE FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
debug('deleteOne param %s',JSON.stringify(dataParam));
debug('deleteOne sql %s',querySql);
var query = self.db.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
LdapJSBackend.prototype.findAllCount = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT count(*) FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
debug('findAllCount param %s',JSON.stringify(dataParam));
debug('findAllCount sql %s',querySql);
var query = self.db.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}

127
lib/backend/mongo.js Normal file
View file

@ -0,0 +1,127 @@
var config = require('./../tcrud-config');
var debug = require('debug')('ff:tcrud:mongo');
module.exports = {
registrate: function(key,server) {
config.registratePlugin(new MongoPlugin(key,server));
}
}
// ------- MongoPlugin Object
function MongoPlugin(key,server) {
this.key = key;
this.server = server;
}
MongoPlugin.prototype.configPlugin = function (ctx) {
ctx.key='mongo#'+this.key;
ctx.description='Adds mongo backend support.';
};
MongoPlugin.prototype.createBackend = function() {
return new MongoBackend(this);
}
// -------- MongoBackend
function MongoBackend(plugin) {
this.plugin = plugin;
}
MongoBackend.prototype.getKey = function() {
return this.plugin.key;
}
MongoBackend.prototype.findAll = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+'';
debug('findAll %s',querySql);
var query = self.db.query(querySql,[],function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows);
}
});
};
}
MongoBackend.prototype.createNew = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
};
}
MongoBackend.prototype.findOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview)+'';
debug('findOne param %s',JSON.stringify(dataParam));
debug('findOne sql %s',querySql);
var query = self.db.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
MongoBackend.prototype.updateOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'UPDATE '+tview.tmeta.tmodel.tid+' '+updateValues(tview,data)+' WHERE '+whereKeys(tview);
debug('updateOne param %s',JSON.stringify(dataParam));
debug('updateOne data %s',JSON.stringify(data));
debug('updateOne sql %s',querySql);
var query = self.db.query(querySql, data, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
MongoBackend.prototype.deleteOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'DELETE FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
debug('deleteOne param %s',JSON.stringify(dataParam));
debug('deleteOne sql %s',querySql);
var query = self.db.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}
MongoBackend.prototype.findAllCount = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
var querySql = 'SELECT count(*) FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
debug('findAllCount param %s',JSON.stringify(dataParam));
debug('findAllCount sql %s',querySql);
var query = self.db.query(querySql, dataParam, function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows[0]);
}
});
};
}

271
lib/backend/mongoose.js Normal file
View file

@ -0,0 +1,271 @@
var config = require('./../tcrud-config');
var debug = require('debug')('ff:tcrud:mongoose');
var clone = require('clone');
var validate = require('validate.io');
// ------- MongoosePlugin Object
function MongoosePlugin(key,conn) {
this.key = key;
this.conn = conn;
}
MongoosePlugin.prototype.configPlugin = function (ctx) {
ctx.key='mongoose#'+this.key;
ctx.description='Adds ldap backend support.';
};
MongoosePlugin.prototype.createBackend = function() {
return new MongooseBackend(this);
}
//------- MongooseBackend Object
function MongooseBackend(plugin) {
this.plugin = plugin;
}
MongooseBackend.prototype.getKey = function() {
return this.plugin.key;
}
MongooseBackend.prototype.findAll = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
debug('find all..'+tview.tmeta.tmodel.tid);
var model = self.plugin.conn.model(tview.tmeta.tmodel.tid);
model.find({},function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows);
}
});
// cb();
// var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+'';
// debug('findAll %s',querySql);
// var query = self.db.query(querySql,[],
};
}
MongooseBackend.prototype.createNew = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
};
}
MongooseBackend.prototype.findOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
debug('findOne param %s',JSON.stringify(dataParam));
//debug('findOne sql %s',querySql);
var model = self.plugin.conn.model(tview.tmeta.tmodel.tid);
model.findById(dataParam,function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows);
}
});
// var querySql = 'SELECT '+selectField(tview,crudType)+' FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview)+'';
//
};
}
MongooseBackend.prototype.updateOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
debug('updateOne param %s',JSON.stringify(dataParam));
debug('updateOne data %s',JSON.stringify(data));
var model = self.plugin.conn.model(tview.tmeta.tmodel.tid);
model.save(data,function (err, result) {
if (err) {
debug(err);
cb(err);
} else {
cb(err,result.rows);
}
});
// var querySql = 'UPDATE '+tview.tmeta.tmodel.tid+' '+updateValues(tview,data)+' WHERE '+whereKeys(tview);
//
// debug('updateOne sql %s',querySql);
// var query = self.db.query(querySql, data, function (err, result) {
// if (err) {
// debug(err);
// cb(err);
// } else {
// cb(err,result.rows[0]);
// }
// });
};
}
MongooseBackend.prototype.deleteOne = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
// var querySql = 'DELETE FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
// debug('deleteOne param %s',JSON.stringify(dataParam));
// debug('deleteOne sql %s',querySql);
// var query = self.db.query(querySql, dataParam, function (err, result) {
// if (err) {
// debug(err);
// cb(err);
// } else {
// cb(err,result.rows[0]);
// }
// });
};
}
MongooseBackend.prototype.findAllCount = function(tview,crudType) {
var self = this;
return function(data, dataParam, cb) {
// var querySql = 'SELECT count(*) FROM '+tview.tmeta.tmodel.tid+' WHERE '+whereKeys(tview);
// debug('findAllCount param %s',JSON.stringify(dataParam));
// debug('findAllCount sql %s',querySql);
// var query = self.db.query(querySql, dataParam, function (err, result) {
// if (err) {
// debug(err);
// cb(err);
// } else {
// cb(err,result.rows[0]);
// }
// });
};
}
function autoFieldType(fieldMeta,fieldType) {
if (!fieldMeta) {
throw new Error('no fieldMeta');
}
if (fieldType && fieldType.length != 0) {
return fieldType;
}
if (fieldMeta.type == Date) {
return 'date';
}
return 'text';
}
buildFields = function(modelMeta) {
if (!modelMeta) {
throw new Error('no modelMeta');
}
var tfields = {};
var keys = Object.keys(modelMeta);
for (i = 0; i < keys.length; i++) {
var key = keys[i];
var value = modelMeta[key];
var tfield = null;
if (key && value && value.tfield) {
debug('tfield model cloned');
tfield = clone(value.tfield);
tfield.tid = key;
tfield.tname = tfield.tname;
tfield.type = autoFieldType(value,tfield.ttype);
} else if (key && value) {
debug('tfield model auto created');
tfield = config.createTField(key);
tfield.type = autoFieldType(value);
}
if (tfield.tvalidate && tfield.tvalidate.io) {
debug('tfield validate rule: '+tfield.tvalidate.io);
}
tfields[tfield.tid] = tfield;
}
return tfields;
}
function ss(valueRule) {
return function (value, response) {
response(validate(valueRule,value));
};
}
createModelValidators = function (modelSchema,modelFields) {
if (!modelSchema) {
throw new Error('no modelSchema');
}
if (!modelFields) {
throw new Error('no modelFields');
}
var keys = Object.keys(modelFields);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var tfield = modelFields[key];
if (!tfield.tvalidate) {
continue;
}
if (!tfield.tvalidate.io) {
continue;
}
modelSchema.path(tfield.tid).validate(ss(tfield.tvalidate.io), '{PATH} validation failed: '+tfield.tvalidate.io);
}
}
buildStatics = function(modelFields,modelStatics) {
if (!modelFields) {
throw new Error('no modelFields');
}
if (!modelStatics) {
modelStatics = {};
}
modelStatics['ff_tcrud_fields'] = modelFields;
return modelStatics;
}
buildTEntityModel = function(mongoose,tcrudParent,name) {
var model = mongoose.model(name);
var tcrud = config.createTEntity(tcrudParent,name, '_id');
var tfields = model['ff_tcrud_fields'];
if (tfields) {
tcrud.tmeta.tfields = tfields;
}
tcrud.tmodel = name;
return tcrud;
}
buildTEntityModels = function(conn,tcrudParent) {
var result = [];
var modelNames = conn.modelNames();
for (var i = 0; i < modelNames.length; i++) {
result.push(buildTEntityModel(conn,tcrudParent,modelNames[i]))
}
return result;
}
// ----- wrappers
buildStaticsModel = function(modelMeta,modelStatics) {
return buildStatics(buildFields(modelMeta),modelStatics);
}
buildStaticsModelValidated = function(modelMeta,modelSchema,modelStatics) {
var modelFields = buildFields(modelMeta);
createModelValidators(modelSchema,modelFields);
return buildStatics(modelFields,modelStatics);
}
module.exports = {
buildTEntityModels: buildTEntityModels,
buildStaticsModelValidated: buildStaticsModelValidated,
buildFields: buildFields,
registrate: function(key,conn) {
config.registratePlugin(new MongoosePlugin(key,conn));
}
}