'use strict' const query = require("querystring"); const base64 = require('js-base64').Base64; var API = { parse:function(req,res){ let url = req.url; let URLParse = URL.parse(url,true); let URLArr = URLParse.pathname.split('/'); //Only GET req.param = URLParse.query; // console.log(URLParse.query); API._checkRouter(URLArr[1],req,res); // }else{ // var postdata = ""; // req.addListener("data",function(postchunk){ // postdata += postchunk; // }) // //POST结束输出结果 // req.addListener("end",function(){ // req.param = query.parse(postdata); // API._checkRouter(URLArr[1],req,res); // }) // } }, _checkRouter:function(path,req,res){ // console.log(req.param); switch(path){ case 'getlink': if(req.param['key'] && req.param['key']!='' && req.param['url'] && req.param['url']!=''){ UserDB.findOne({key:req.param['key']},function(err,data){ if(!err && data){ let oldLink = req.param['url']; let qr = 0; if(req.param['qr'] && Number(req.param['qr'])==1) qr = 1; if(req.param['base64'] && req.param['base64']==0){ if(oldLink.match(/http(s)?:\/\//)){ MongoHandler.getlink(req.param['key'],oldLink,res,qr); }else{ API._onError(ErrorMsg.URL_WRONG,res); return; } }else{ oldLink = base64.decode(oldLink); if(oldLink.match(/http(s)?:\/\//)){ MongoHandler.getlink(req.param['key'],oldLink,res,qr); }else{ API._onError(ErrorMsg.URL_WRONG,res); return; } } }else{ API._onError(ErrorMsg.KEY_WRONG,res); } }); }else{ if(!req.param['key']){ API._onError(ErrorMsg.KEY_LOST,res); return; } if(!req.param['url']){ API._onError(ErrorMsg.URL_LOST,res); return; } } break; case 'check': break; default: res.writeHead(404, {'Content-Type': 'text/html'}); res.end('404'); } }, _onError:function(msg,res){ var data = {success:0,msg:msg,short:'',long:''}; res.writeHead(200, {'Content-Type': 'text/json','Access-Control-Allow-Origin':'*'}); res.write(JSON.stringify(data)); res.end(); } } var MongoHandler = { getlink:function(key,url,res,qr){ let baseLink; baseLink = base64.encode(url); // console.log(baseLink,newLink); LinkDB.findOne({long:baseLink},function(err,oldOne){ if(!err){ let data = {success:1,msg:'',short:SystemURL,long:url}; if(oldOne){ data.short += oldOne.short; if(qr) data.qr = SystemURL+'static/qrs'+QRHandler.getQR(oldOne.short); res.writeHead(200, {'Content-Type': 'text/json','Access-Control-Allow-Origin':'*'}); res.write(JSON.stringify(data)); res.end(); }else{ let newLink,count = COUNT.link+1; newLink = count.toString(36); LinkDB.update({key:key,long:baseLink},{$set:{short:newLink}},{upsert:true},function(err,result){ if(!err && result){ data.short += newLink; if(qr) data.qr = SystemURL+'static/qrs'+QRHandler.getQR(newLink); res.writeHead(200, {'Content-Type': 'text/json','Access-Control-Allow-Origin':'*'}); res.write(JSON.stringify(data)); res.end(); COUNT.link++; CountDB.update({},{$inc:{link:1}},{upsert:true}); }else{ API._onError(ErrorMsg.MAKE_ERROR,res); } }); } }else{ API._onError(ErrorMsg.MAKE_ERROR,res); } }); } } var QRHandler = { getQR:function(tagName){ let qrImgPath = '/'+tagName+'.png'; if(!FILE.exists(QRPATH+qrImgPath)){ let qr = new QR({value:SystemURL+'/'+tagName}); let qrData = qr.toDataURL().replace(/^data:image\/\w+;base64,/, ""); FILE.writeFileSync(QRPATH+qrImgPath,new Buffer(qrData, 'base64'),'binary'); } return qrImgPath; } } const ErrorMsg = { NONE:'', KEY_LOST :'Key is missing', KEY_WRONG :'Key is incorrect', URL_LOST :'URL is missing ', URL_WRONG :'URL must start with "http://" or "https://"', MAKE_ERROR :'Short link generate error,please contact with l2s.ch' } module.exports = API;