UNPKG

sumeru

Version:

A Realtime Javascript RIA Framework For Mobile WebApp

276 lines (235 loc) 9 kB
//pcs 轮询服务 var pcs = require(__dirname + '/driver/pcs.js'); var applog = require('./driver/applog.js'); // var log = require(__dirname + '/../sumeru/log.js')(fw); module.exports = function(fw, getDbCollectionHandler){ require(__dirname + '/../config/app-baidualbum.js')(fw); var im = require('./driver/imageMeta.js')(fw); var pcspoll = fw.config.defineModule('pcspoll'); pcspoll({ pcsInterval:1000,//pcs轮询时间间隔 albumTableName:"pics",//轮询插入的model name albumTimelineTableName:"picsTimeline",//轮询插入的model name thumbnailHost:"127.0.0.1",//port thumbnailPort:"2013",//port }); //compfunc 为比较函数。用于比较两个item是否一致 var inArray = function(array,item,compfunc){ if(typeof compfunc == "undefined"){ compfunc = function(a,b){ return (a["path"] == b["path"] &&a["ctime"] == b["ctime"]); } } for(var i=0,ilen = array.length;i<ilen;i++){ var compvalue = compfunc(array[i],item); if(compvalue){ return i; } } return -1; } //处理thumbnail的url 到代理上去。 var getThumbnailURL = function(path,userinfo,width,height){ var _thumbnail = pcs.GetThumbnailURL(path,width,height); _thumbnail = _thumbnail.replace(/^http\S+thumbnail/,"http://"+fw.config.pcspoll.get("thumbnailHost")+":"+fw.config.pcspoll.get("thumbnailPort")+"/thumbnail"); var _u = { "USERID":userinfo["token"], "BDUSS":userinfo["info"]["bduss"] } _thumbnail += "&"+fw.utils.mapToUriParam(_u); return _thumbnail; } var getLayoutType = function(r){//计算w/h比例范围 var type; if(r>2){ type = 0; }else if(r>0.5){ type = 1; }else{ type = 2; } return type; } //将从pcs取出来的数据,格式化为要插入mongo DB的数据 var formatPcsData = function(userinfo,value){ var _obj = {}; _obj["username"] = userinfo["token"]; _obj["userid"] = value["user_id"]; _obj["fs_id"] = value["fs_id"]; _obj["ctime"] = value["ctime"]; _obj["path"] = value["path"]; _obj["filename"] = value["server_filename"]; _obj["thumbnail"] = getThumbnailURL(_obj["path"],userinfo,640,1000); _obj["size"] = value["size"]; _obj["src"] = value["s3_handle"]; //_obj["width"] = 0; //_obj["height"] = 0; return _obj; } //offset目前只支持d,m var getDateFromTime = function(timestamp,offset){ var d,dd; d = new Date(timestamp*1000); dd = new Date(d.getFullYear()+"-"+(d.getMonth()+1)+'-'+d.getDate());//去掉小时分钟和秒 d = dd;//变换 if (typeof offset != 'undefined' ){ //explain the offset if (offset.substr(-1) == "m") { d.setMonth((d.getMonth() - parseInt(offset) )); }else{ d.setDate((d.getDate() - (parseInt(offset)) ));//1day表示当天 } } return d.getFullYear()+"-"+(d.getMonth()+1); } //将全量的pcs抓取数据,转换成timeline数据 var createTimelineData = function(username, data){ var timeline = []; //console.log("---------------------------------------"); //console.log(data); //console.log("---------------------------------------"); for(var i=0, ilen = data.length;i<ilen;i++){ var item =data[i]; var timename = getDateFromTime(item["ctime"],"0m"); if(typeof timeline[timename] == "undefined"){ timeline[timename] = {}; timeline[timename]["username"] = username; timeline[timename]["userid"] = item["user_id"]; timeline[timename]["timename"] = timename; timeline[timename]["size"] = 1; timeline[timename]["newsize"] = 1; timeline[timename]["stime"] = item["ctime"]; timeline[timename]["etime"] = item["ctime"]; timeline.push(timeline[timename]); }else{ timeline[timename]["size"]++; timeline[timename]["newsize"]++; timeline[timename]["etime"] = item["ctime"]; } } return timeline; } fw.reqPcsData = function(callback, userinfo, modelName){ var username = userinfo.token,bduss = userinfo.info.bduss; var timelineModelName = fw.config.pcspoll.get("albumTimelineTableName"); pcs.GetFileList(function(err,data){ if (err) { fw.log('get file list error', err); return; }; if (!err){ var newData = data["list"]; //处理newdata只保留jpg,不需要了。所有图片格式都支持,ye~ /*for(var i=0,ilen = newData.length;i<ilen;i++){ if(!/\.jpg$/.test(newData[i]["s3_handle"])){ newData.splice(i,1); i--; } }*/ try{ //根据新数据重新生成timeline var dbTimeline = getDbCollectionHandler(timelineModelName); dbTimeline.find({"username":username}).toArray(function(err, items){ var timelineData = createTimelineData(username,newData); //diff新老数据 for(var i=0,ilen = items.length;i<ilen;i++){ var _index = inArray(timelineData,items[i],function(a,b){ return (a["userid"] == b["userid"] &&a["timename"] == b["timename"]); }); if(_index>=0){ dbTimeline.update({_id:items[i]["_id"]},//{"userid":items[i]["userid"],"timename":items[i]["timename"]}, {$set:{"newsize":parseInt(timelineData[_index]["size"]) - parseInt(items[i]["size"]), "size":timelineData[_index]["size"], "etime":timelineData[_index]["etime"] }}); timelineData.splice(_index,1); }else{ dbTimeline.remove({_id:items[i]["_id"]}); } } if(timelineData.length>0){ for(var i=0,ilen = timelineData.length;i<ilen;i++){ dbTimeline.insert(timelineData[i]); }; } }); var dbPics = getDbCollectionHandler(modelName); dbPics.find({"username":username}).toArray(function(err, items){ var removeList = [];//记录需要删除的id var removedLen = 0; var insertedLen = 0; //var insertList = []//记录需要插入的obj,这个不需要了,需要插入的数据,世界就是newdata. //对callback进行包装,目的是所有的数据都处理完之后才执行 var _callback = function(_type){ if(_type=='remove'){ removedLen++; }else if(_type=='insert'){ insertedLen++; } if(removedLen>=removeList.length && insertedLen>=newData.length){ /*log.write("trigger model push++++"); log.write("removedLen:"+removedLen); log.write("insertedLen:"+insertedLen); log.write("removeList.length:"+removeList.length); log.write("newData.length:"+newData.length);*/ callback(); } } //diff新老数据 for(var i=0,ilen = items.length;i<ilen;i++){ var _index = inArray(newData,items[i]); if(_index>=0){ dbPics.update({_id:items[i]["_id"]},//{"userid":items[i]["userid"],"timename":items[i]["timename"]}, {$set:{"thumbnail":getThumbnailURL(newData[_index]["path"],userinfo,640,1000), "src":newData[_index]["s3_handle"] }}); newData.splice(_index,1); }else{ removeList.push({_id:items[i]["_id"]}); dbPics.remove({_id:items[i]["_id"]},{safe:true},function(){ _callback("insert"); }); } } if(newData.length>0){ /*log.write("dbitems:"+items.length); log.write("newData:"+newData.length); log.write(items[0]); log.write(newData[0]);*/ for(var i=0,ilen = newData.length;i<ilen;i++){ var picObj = formatPcsData(userinfo,newData[i]); //console.log('---xxx---xxx-', i); im.get(picObj["src"],function(_dbPics,_picObj,_i){ return function(meta){ _picObj["width"] = meta.width; _picObj["height"] = meta.height; _picObj["r"] = (_picObj["width"]/_picObj["height"]); _picObj["_r"] = 1/_picObj["r"]; _picObj["_type"] = getLayoutType(_picObj["r"]); _dbPics.insert(_picObj,{safe:true},function(){ _callback("insert"); }); } }(dbPics,picObj,i) ); /*dbPics.insert(picObj,{safe:true},function(){ _callback("insert"); });*/ //console.log(formatPcsData(username,newData[i])); }; needPush = true; } }); }catch(e){ applog.applog("new data error:"+e); } }else{ fw.log("error:"+err); } }, username,bduss); } }