nyx_server
Version:
Node内容发布
164 lines (145 loc) • 5.22 kB
JavaScript
/* global global */
var utils = require('./utils/PublishUtil');
var Promise = require("bluebird");
var _ = require('lodash');
var EmptyContext = require("./EmptyContext");
var projectMatchService = require('./ProjectMatchService');
var projectLoader = require('./ProjectLoader');
var projectFn = require("./Project");
function TempalteNodeDataFactory(data){
return new function(){
var types = {}; //数据类型
this.getData = function(){
return types;
};
this.addData = function(data){
var type = data.type;
var supportDevices = (data.devices||"pc").replace(/\s/ig,"");
if(supportDevices == 'all'){
supportDevices = "pc,pad,moible";
}
var devices = supportDevices.split(",");
var _data = data.data;
if(!types[type]){
types[type] = {};
}
devices.forEach(function(device){
types[type][device] = _data;
});
};
this.addData(data);
};
}
function createTemplateStore(){
return new (require("./utils/TreeStore"))(TempalteNodeDataFactory);
}
function _loaderProject(path){
var promise = null;
var context = this.log ? this : EmptyContext;
promise = projectMatchService.findMatchProjects.bind(context)(path);
promise = promise.then(function(projectNames){
if(projectNames.length==0 && projectLoader.workProject){
projectNames = [{name:projectLoader.workProject.name}];
}
return projectLoader.loadProjects.bind(context)(projectNames);
});
return promise;
}
function _loaderTemplate(path){
var context = this.log ? this : EmptyContext;
var promise = _loaderProject.bind(context)(path);
promise = promise.map(function(project){
return projectFn.loadTemplates.bind(context)(project);
}).then(function(templates){
return _.flatten(templates);
});
return promise;
}
function _loaderTemplateAndStoreTemplate(path){
var context = this.log ? this : EmptyContext;
return _loaderTemplate.bind(context)(path).then(function(templates){
return storeTemplate.bind(context)(templates);
});
}
/**
* 装载匹配的模板
* @param path 请求
*/
function loaderTemplate(requestInfo){
var context = this.log ? this : EmptyContext;
var log = context.log;
var cache = context.cache;
if(!cache.templateStore){
cache.templateStore = createTemplateStore();
}
log.info("装载模板");
var promise = _loaderTemplateAndStoreTemplate.bind(context)(requestInfo.path);
var path = requestInfo.path;
var device = requestInfo.params.device || "pc";
var fileType = requestInfo.params.fileType;
promise = promise.then(function(){
var templateDataNode = cache.templateStore.matchPath(path);
var err = "";
if(!templateDataNode){
log.error("no match Template , request info : "+ JSON.stringify(requestInfo));
err = "没有匹配的模板";
return Promise.reject(new Error(err));
}
var nodeData = templateDataNode.getData();
if(!nodeData){
log.error("no Template Data , request info : "+ JSON.stringify(requestInfo));
err = "没有模板数据";
return Promise.reject(new Error(err));
}
var devices = nodeData[fileType];
if(!devices || !devices[device]){
log.error("no match device , request info : "+ JSON.stringify(requestInfo));
err = "没有匹配相应设备的模板";
return Promise.reject(new Error(err));
}
var template = devices[device];
return template;
}).then(function(result){
log.info("装载模板完成 , 模板名称 : " , result.name);
return result;
});
return promise;
}
module.exports.loaderTemplate =loaderTemplate;
/**
*根据路径请求所有可用的模板信息
@param path 模板路径
*/
function loaderTemplateWithPath(path){
var context = this.log ? this : EmptyContext;
var log = context.log;
var cache = context.cache;
if(!cache.templateStore){
cache.templateStore = createTemplateStore();
}
var promise = _loaderTemplateAndStoreTemplate.bind(context)(path);
promise = promise.then(function(){
var templateDataNode = cache.templateStore.matchPath(path);
if(!templateDataNode){
return [];
}
var data = templateDataNode.getData();
var ret = _.values(data).map(function(v){
return _.values(v);
});
return _.flatten(ret);
});
return promise;
}
module.exports.loaderTemplateWithPath =loaderTemplateWithPath;
function storeTemplate(templates){
var context = this.log ? this : EmptyContext;
var cache = context.cache;
templates.forEach(function(template){
var matchPath = template.getMatchPath();
var supportDevices = template.getSupportDevices();
var fileType = template.getFileType();
cache.templateStore.addNode(matchPath , {type:fileType , devices:supportDevices , data : template});
});
return true;
}