UNPKG

mysql-restful

Version:
649 lines (632 loc) 23.2 kB
var dbs = require('./dbcon.js'); var utils = require('./fgen.js'); var ed = require('./ncrypto.js'); var rdb = require('./rapidpg.js'); var fs = require('fs'); var cto = require('./myst.js'); var rpda = require('./rpdafter.js'); var rpdb = require('./rpdbefore.js'); var pem = require('./cesmod.js'); var crc = require('buffer-crc32'); var jwt = require('jsonwebtoken'); module.exports = { deletesql: function(req,res){ if (!req.body){return res.send({error:"body data required"})} if (!req.body.id){return res.send({error:"id is required"})} function final(err,rsp){ if (err){return res.status(401).send({error:err})} if (req.body.inuse == false){ delete process.rapidcfg.mdb.esqls[req.body.queryname] } else { delete process.rapidcfg.mdb.sqls[req.body.queryname] } return res.send({message:rsp}) }; function cb(err,data){ //console.log(err); client.query("delete from sqls where id = $1",[req.body.id],function(err, result){ client.end(); if (err) { return final({message:"error",error:"can not delete",errmsg:err}); }; final(false,result); }); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb) }, saveiplist: function(req,res){ //console.log(req.body.aip) var file = req.body.aip; process.rapidcfg.ipallow = JSON.parse(req.body.aip); fs.writeFileSync(process.env.mpath+'ipallow.json',file); res.send({message:"OK"}); }, ipallowlist: function(req,res){ var ret = {}; ret.ip = utils.reqip(req); ret.aip = process.rapidcfg.ipallow; return res.send(ret); }, loadtokens:function(req,res){ function final(err,data){ client.end(); if (err){return res.status(404).send({message:"error",error:err})}; data.forEach(function(row){ row.jwt = 'Bearer '+jwt.sign(JSON.parse(row.token),process.env.token_key); }); res.send({message:"OK",tokens:data}); }; function cb(err,data){ if (err){return res.status(404).send({message:"error",error:"can not connect the database"})}; dbs.runquery(client,"select * from tokens order by tname",[],'json',final); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb) }, savetoken: function(req,res){ if (!req.body.id){return res.status(404).send({message:"error",error:"incomplete request - tkid"})} if (!req.body.tname){return res.status(404).send({message:"error",error:"incomplete request - tkname"})} if (!req.body.token){return res.status(404).send({message:"error",error:"incomplete request - token"})} function final(err,data){ client.end(); //console.log(data); if (err){return res.status(404).send({message:"error",error:err})}; req.body.jwt = 'Bearer '+jwt.sign(JSON.parse(req.body.token),process.env.token_key); var rows = [req.body]; res.send({message:"OK",saved:{rows:rows}}); }; function cb(err,data){ if (err){return res.status(404).send({message:"error",error:"can not connect the database"})}; if (req.body.id=='new'){ isnew = true; req.body.id = utils.uuid(); }; if(isnew){ req.body.createdAt = utils.timeymd(); req.body.updatedAt = utils.timeymd(); dbs.insert(client,'tokens',req.body,'json',final) } else { req.body.updatedAt = utils.timeymd(); dbs.update(client,'tokens','id',req.body.id,req.body,'json',final)} }; var isnew = false; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb) }, pubjs: function(req,res){ if (!req.body.fid){return res.status(404).send({message:"error",error:"incomplete request"})} var ce = req.body.fid; var file = fs.readFileSync(process.env.mpath+'js/jsedit-psql/'+ce+'.js'); fs.writeFileSync('js/'+ce+'.js',file); res.send({message:"OK"}); process.exit(9); }, checkjs: function(req,res){ //console.log(req.body); if (!req.body.fid){return res.status(404).send({message:"error",error:"incomplete request"})} var ce = req.body.fid; var exec = require('child_process').exec; var fs = require('fs'); var child = ""; var msgsend = false; var file = fs.readFileSync(process.env.mpath+'js/jsedit-psql/'+ce+'.js'); fs.writeFileSync('js/testjs.js',file); child = exec('node js/test2.js'); child.stdout.on('data', function(data) { //console.log(data); }); child.stderr.on('data', function(data) { //console.log(data); return res.status(404).send({message:"error",error:data}) }); child.on('close', function(code) { if (code === 0){res.send({message:"OK"})}; }); }, savemode: function(req,res){ //console.log('savemode:',req.body); if (req.body.p0===null){return res.status(404).send({message:"error",error:"incomplete request"})} if (req.body.p1<80){return res.status(404).send({message:"error",error:"incomplete request"})} if (req.body.p2===null){return res.status(404).send({message:"error",error:"incomplete request"})} if (req.body.p3===null){return res.status(404).send({message:"error",error:"incomplete request"})} var c = { development:!req.body.p2, devssl:req.body.p3, port:req.body.p1, start:req.body.p0 } fs.writeFileSync(process.env.mpath+'env.json', JSON.stringify(c,null,2)); process.rapidcfg.env = c; res.send({message:"OK"}); process.exit(9); }, savessl: function(req,res){ //console.log(req.body); if (!req.body.c){return res.status(404).send({message:"error",error:"incomplete request"})} if (!req.body.k){return res.status(404).send({message:"error",error:"incomplete request"})} pem.readcertificate(req.body.c, read) function read(err,crt){ if (err){return res.send({message:"error",error:"invalid certificate"})} pem.readpubkey(req.body.k,final) }; function final(err,data){ if (err){return res.send({message:"error",error:"invalid key"})} var oldcrt = fs.readFileSync(process.env.mpath+'ssl/service.crt').toString(); var oldkey = fs.readFileSync(process.env.mpath+'ssl/service.key').toString(); fs.writeFileSync(process.env.mpath+'ssl/bkp/service.crt', oldcrt); fs.writeFileSync(process.env.mpath+'ssl/bkp/service.key', oldkey); fs.writeFileSync(process.env.mpath+'ssl/service.crt', req.body.c); fs.writeFileSync(process.env.mpath+'ssl/service.key', req.body.k); res.send({message:"OK"}) //console.log('exit'); process.exit(9); }; }, getsslinfo: function(req,res){ var d1 = new Date() var d2 = new Date() var crt = fs.readFileSync(process.env.mpath+'ssl/service.crt').toString() pem.readcertificate(crt, read) function read(err,crt){ d1.setTime(crt.validity.start); crt.validity.start = d1; d2.setTime(crt.validity.end); crt.validity.end = d2; return res.send({message:"OK",certificate:crt}) }; }, savetpwd: function(req,res){ if (!req.body.tk){return res.status(404).send({message:"error",error:"incomplete request"})} process.rapidcfg.etk = ed.enc(req.body.tk); process.env.token_key = req.body.tk; var c = { userapid:true, host:process.rapidcfg.host, port:process.rapidcfg.port, user:process.rapidcfg.user, password:process.rapidcfg.password, rapiddb:process.rapidcfg.rapiddb, rapidid:process.rapidcfg.rapidid, suser:process.rapidcfg.suser, spwd:process.rapidcfg.spwd, isnew:process.rapidcfg.isnew, etk:process.rapidcfg.etk }; fs.writeFileSync(process.env.mpath+'config.json', JSON.stringify(c,null,2)); return res.send({message:"OK"}); }, putjs: function(req,res){ if (!req.body.fid){return res.status(404).send({message:"error",error:"incomplete request"})} if (!req.body.file){return res.status(404).send({message:"error",error:"incomplete request"})} function writefile(err,data){ if (err){return res.status(404).send({message:"error",error:err})} return res.send({message:"OK",file:data}) }; fs.writeFile(process.env.mpath+'js/jsedit-psql/'+req.body.fid+'.js', req.body.file, writefile) }, getjs: function(req,res){ var ce = req.query.atr; var fl1 = ""; function readback2(err,filedata2){ if (err){return res.status(404).send({message:"error",error:err})}; var checkcrc = false; var c1 = crc.unsigned(fl1); var c2 = crc.unsigned(filedata2); if (c1==c2){checkcrc = true} return res.send({message:"OK",file:fl1.toString(),okcrc:checkcrc}) }; function readback1(err,filedata1){ if (err){return res.status(404).send({message:"error",error:err})}; fl1=filedata1; fs.readFile('js/'+ce+'.js', readback2) }; fs.readFile(process.env.mpath+'js/jsedit-psql/'+ce+'.js', readback1) }, reset: function(req,res){ res.send({message:"OK",reset:"now"}); process.exit(9); }, validatesql: function(req,res){ //console.log(req.body); function final(err,result){ if (err){return res.status(404).send(err)}; var mts = process.rapidcfg.mdb.esqls[req.body.queryname]; mts.inuse = true; process.rapidcfg.mdb.sqls[req.body.queryname] = mts; delete process.rapidcfg.mdb.esqls[req.body.queryname] //delete ; //console.log(process.rapidcfg.mdb.sqls); return res.send({message:"OK",result:result}); }; function cb(err,data){ if (err){client.end();return res.send({message:"error",error:"can not connect the database server"})} var values = [] var inuse = true; var updatedAt = utils.timeymd(); values.push(inuse); values.push(updatedAt); values.push(req.body.id); sqlstat ='UPDATE sqls SET inuse=?,updatedAt=? WHERE id = ?' client.query(sqlstat,values,function(err, result){ client.end(); if (err) { return final({message:"error",error:"can not load information",errmsg:err}); }; final(false,result); }); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb); }, rpdquery: function(req,res){ var rcfg = process.rapidcfg; var query = req.query; var iserr = false; function rdbcb(err,response){ if (err) { if (!iserr){ res.status(404).send(err)} iserr = true; return -1; } if (!iserr) { var testtoken = { user:'test', email:'test@test.com' } var testjwt = jwt.sign(testtoken,process.env.token_key); response.testtoken = testjwt; return res.send(response)}; }; function seterror(error_name,desc,has_required){ err = {error:error_name, description:desc, method:'GET', action:'rpdquery', notes:'run a SQL statement stored serverside by name and other required parameters'} if (has_required == 1){ err.required = ['csql', 'limit', 'offset']; err.csql = 'sql statement name'; err.limit = 'number of records to be returned'; err.offset = 'start record number from result set'}; return err }; function qccb(error,message){ response = '' if (message){ response = {} response[query.csql] = message } client.end(); //console.log(response); rdbcb(error,response); }; if (!query.csql) {return rdbcb(seterror('missing parameter','csql - is required',1),'')}; if (!query.limit) {return rdbcb(seterror('missing parameter','limit - is required',1),'')}; if (!query.offset){return rdbcb(seterror('missing parameter','offset - is required',1),'')}; if (!rcfg.mdb.esqls[query.csql]) { if (!rcfg.mdb.sqls[query.csql]){ return rdbcb(seterror('Query:'+query.csql,'Query does not exist!',1),'') } else {var sqlstat = rcfg.mdb.sqls[query.csql].sqlstat; }; } else {var sqlstat = rcfg.mdb.esqls[query.csql].sqlstat}; query.limit = 10; query.offset = 0; var arr = [] if (sqlstat.search("&")>-1){ arr = sqlstat.match(/(^|\s)&(\w+)/g).map(function(v){return v.trim().substring(1);}); //console.log(arr); arr = arr.filter(function (e, i, arr) { return arr.lastIndexOf(e) === i; }); //console.log(arr); } var qp = [] arr.forEach(function(item){ if (!query[item]) {return rdbcb(seterror('missing parameter',item+' - parameter is required',0),'')}; sqlstat = sqlstat.split('&'+item).join('?') }); if (!iserr){ function dbconncb (error,message){ if (error){ client.end() return rdbcb({error:'rapid database connection error/ '+dbcon.rapiddb},""); }else{ arr.forEach(function(item){ qp.push(query[item]); }); dbs.getsql(client,sqlstat,qp,query.limit,query.offset,qccb); }; }; var dbcon = {} var dbname = "" if (rcfg.mdb.databases.number == 1){ dbname = rcfg.mdb.databases.names[0]; } else { if (rcfg.mdb.esqls[query.csql]){ dbname = rcfg.mdb.esqls[query.csql].database; } else { if (rcfg.mdb.sqls[query.csql]){ dbname = rcfg.mdb.sqls[query.csql].database; } else { err = seterror('invalid parameter/ csql',query.csql +' SELECT STAT. - does not exist or is not in use',0); return rdbcb(err,'')}; }; }; rcfg.distributeddata === 0 if (rcfg.distributeddata === 0 || rcfg.mdb.databases[dbname].distributeddata === 0){ dbcon = rcfg.mdb.databases[dbname]; dbcon.rapiddb = dbname } else { var dist_db = dbs.getdbdist(dbname,req.token.user); if (rcfg.mdb.connections[dist_db]){ dbcon = rcfg.mdb.connections[dist_db]; dbcon.rapiddb = dist_db; } else { err = seterror('distributed database setting error',dist_db +' database - does not exist',0); err.notes = 'distributed database settings need additional settings'; return rdbcb(err,''); }; }; // implement before var bfunc = query.csql+'RunSql' var client = {} if (typeof rpdb[bfunc] == 'function') { rpdb[bfunc](req,req.query,start); } else { start ()} function start(err){ if (err) {return rdbcb({error:err},'')}; client = dbs.getclient(dbcon); client.connect(dbconncb) } } }, savesql: function(req,res){ if (!req.body){return res.send({message:"error",error:"csql data required"})}; if (!req.body.queryname){return res.send({message:"error",error:"queryname required"})}; if (!req.body.sqlstat){return res.send({message:"error",error:"sqlstat required"})}; if (!req.body.db){return res.send({message:"error",error:"db required"})}; if (!req.body.id){return res.send({message:"error",error:"id required"})}; function final(err,response){ //console.log(err); if(err){return res.send(err)}; var psd = utils.findobjectbyval(process.rapidcfg.mdb.esqls,"id",req.body.id); if(psd.length === 0){ psd = utils.findobjectbyval(process.rapidcfg.mdb.sqls,"id",req.body.id); } //console.log(psd); delete process.rapidcfg.mdb.esqls[psd[0].objname] delete process.rapidcfg.mdb.sqls[psd[0].objname] process.rapidcfg.mdb.esqls[req.body.queryname] = { id : req.body.id, database:req.body.db, inuse:false, sqlstat:req.body.sqlstat, dbtype:'mysql'} if(response){return res.send({message:"OK",item:process.rapidcfg.mdb.esqls[req.body.queryname],rsp:response})}; }; function cb(err,data){ if (err){client.end();return res.send({message:"error",error:"can not connect the database server"})} var values = [] var sqlname = req.body.queryname.toLowerCase(); var sqlstat = req.body.sqlstat; var inuse = false; var updatedAt = utils.timeymd(); var dbid = process.rapidcfg.mdb.databases[req.body.db].id; values.push(sqlname); values.push(sqlstat); values.push(inuse); values.push(updatedAt); values.push(dbid); values.push(req.body.id); sqlstat ='UPDATE sqls SET sqlname=?,sqlstat=?,inuse=?,updatedAt=?,dbid=? WHERE id = ?' //console.log(sqlstat); client.query(sqlstat,values,function(err, result){ client.end(); if (err) { return final({message:"error",error:"can not load information",errmsg:err}); }; final(false,result); }); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb); }, newsql: function(req,res){ if (!req.body){return res.send({message:"error",error:"csql data required"})}; if (!req.body.queryname){return res.send({message:"error",error:"queryname required"})}; if (!req.body.sqlstat){return res.send({message:"error",error:"sqlstat required"})}; if (!req.body.db){return res.send({message:"error",error:"db required"})}; if (!req.body.id){return res.send({message:"error",error:"id required"})}; req.body.queryname = req.body.queryname.toLowerCase(); var newid = utils.hash(req.body.queryname,26) if (!process.rapidcfg.mdb.databases[req.body.db].id){return res.send({message:"error",error:"invalid db "+req.body.db})}; function final(err,response){ //console.log(err); if(err){return res.status(401).send(err)}; //console.log(response); process.rapidcfg.mdb.esqls[req.body.queryname] = { id:newid, database:req.body.db, inuse:false, sqlstat:req.body.sqlstat, dbtype:'mysql'} if(response){return res.send({message:"OK",item:process.rapidcfg.mdb.esqls[req.body.queryname],rsp:response})}; }; function cb(err,data){ if (err){client.end();return res.status(404).send({message:"error",error:"can not connect the database server"})} var f = [newid, req.body.queryname.toLowerCase(), req.body.sqlstat, false, utils.timeymd(), utils.timeymd(), false, process.rapidcfg.mdb.databases[req.body.db].id] sqlstat ='insert into sqls set id=?,sqlname=?,sqlstat=?,inuse=?,createdAt=?, updatedAt=?,deleted=?,dbid=?'; //sqlstat = sqlstat + " values ("+utils.k2l(f)+")"; //console.log(sqlstat); client.query(sqlstat,f,function(err, result){ client.end(); if (err) { return final({message:"error",error:"can not load information",errmsg:err}); }; final(false,result); }); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb); }, adddbs: function(req,res){ if (!req.body){return res.send({message:"error",error:"dbname is required"})}; if (!req.body.dbname){return res.send({message:"error",error:"dbname is required"})}; function cb(err,data){ function final(err,result){ sclient.end(); sclient = {}; //console.log(err); if (err){return res.send(err)} else { return res.send({message:"OK",result:result})}; } function cbs(err,data){ if (err){return res.send({message:"error",error:"can not connect the database server"})}; sqlstat ='insert into dbs (id,cfgid,database,dbtype,host, port,user_,password,"createdAt", "updatedAt",distributeddata)'; sqlstat = sqlstat + " values ('"+utils.hash(req.body.dbname.toLowerCase(),26)+"','default','"+req.body.dbname+"','mysql','"+process.rapidcfg.host+"',"+process.rapidcfg.port+",'"+ process.rapidcfg.user+"','"+process.rapidcfg.password+"','" + utils.timeymd() +"','"+utils.timeymd()+"',0)"; //console.log(sqlstat); sclient.query(sqlstat,function(err, result) { if (err) { final({message:"error",error:"can not insert db record",errmsg:err}); } else {final(false,result)}; }); }; client = {}; if (err){return res.send({message:"error",error:"can not connect the database server"})}; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); sclient.connect(cbs); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb); }, getdbs:function(req,res){ function final(err,result){ if (err) {return res.send({message:"error",error:"can not connect the database server"})} //console.log(result) var dbs = []; result.forEach(function(db){ //console.log(db.datname); //if (db.datname != "postgres"){if (db.datname != "rdsadmin"){dbs.push(db.datname)}}; if (db.Database != "mysql" && db.Database != "rdsadmin" && db.Database != "rcfg" && db.Database != "information_schema"){dbs.push(db.Database)} }) return res.send({message:"OK",data:dbs}); }; function cb(err,data){ if (err){client.end();return res.send({message:"error",error:"can not connect the database server"})} var sqlstat = "SHOW SCHEMAS"; client.query(sqlstat,function(err, result) { client.end(); if (err) { return final({message:"error",error:"can not load information",errmsg:err}); }; final(false,result); }); }; var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb); }, getmdb:function(req,res){ //console.log('getmdb hit'); var copt = {domain:process.rapidcfg.host, port:process.rapidcfg.port, db:"",usern:process.rapidcfg.user,pwd:""} if (process.rapidcfg.mdb){ var nsd = JSON.stringify(process.rapidcfg.mdb); var nobj = JSON.parse(nsd); //console.log(nobj); if (nobj.databases){ if (nobj.databases.names){ nobj.databases.names.forEach(function(dbs){ delete nobj.databases[dbs].user; delete nobj.databases[dbs].password; }) }}; nobj.host = process.rapidcfg.host; nobj.port = process.rapidcfg.port; nobj.dbuser = process.rapidcfg.user; //console.log(JSON.stringify(nobj)); return res.send({result:"OK",mdb:nobj,env:process.rapidcfg.env}); } else {return res.send({error:"can not connect the database server",copt:copt})}; }, reload:function(req,res,cfg){ process.rapidcfg.mdb={}; var copt = {domain:process.rapidcfg.host, port:process.rapidcfg.port, db:"",usern:process.rapidcfg.user,pwd:""} function result(){ //console.log('result'); if (process.rapidcfg.mdb){ var nsd = JSON.stringify(process.rapidcfg.mdb); var nobj = JSON.parse(nsd); //console.log(nobj); if (nobj.databases){ if (nobj.databases.names){ nobj.databases.names.forEach(function(dbs){ delete nobj.databases[dbs].user; delete nobj.databases[dbs].password; }) }}; nobj.host = process.rapidcfg.host; nobj.port = process.rapidcfg.port; nobj.dbuser = process.rapidcfg.user; return res.send({result:"OK",mdb:nobj}); } else {return res.send({error:"can not connect the database server",copt:copt})}; //console.log(JSON.stringify(process.rapidcfg)); } function cb(err,data){ //console.log(err); //console.log(data); client.end() client = {}; if (err){ if (err.code){ if (err.code == 'ER_ACCESS_DENIED_ERROR'){ //console.log("Invalid password or username"); return next({dbconf:"error",error:"Invalid password or username",errmsg:err}); }; if (err.code == 'ENOTFOUND'){ return next({dbconf:"error",error:"Invalid address IP",errmsg:err}); }; if (err.code == 'ECONNREFUSED'){ //console.log("Invalid address"); return next({dbconf:"error",error:"Invalid address port",errmsg:err}); }; if (err.code == 'ER_BAD_DB_ERROR'){ createdata(); }; }; return res.send({error:errmsg,errdata:err,copt:copt})}; cfg.loadmdb(process.rapidcfg,result); } var con = utils.getdbpar(); con.database = con.rapiddb; var client = dbs.getclient(con); client.connect(cb); } }