UNPKG

nyx_server

Version:

Node内容发布

164 lines (145 loc) 5.22 kB
/* 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; }