nyx_server
Version:
Node内容发布
160 lines (144 loc) • 5.71 kB
JavaScript
/* global global */
/*****************************************************************
项目
******************************************************************/
var _ = require("lodash");
var Promise = require("bluebird");
var glob = require('glob');
var path = require('path');
var fs = require("fs");
var EmptyContext = require("./EmptyContext");
var projectLoader = require("./ProjectLoader");
var projectMatchService = require('./ProjectMatchService');
var PermissionError = require("./exception/PermissionError");
var PermissionConstant = require("./PermissionConstant");
/********************
* 项目函数
********************/
function getConfigs(project) {
var context = this.log ? this : EmptyContext;
var log = context.log;
var cache = context.cache;
if(cache.loadConfigsPromise && cache.loadConfigsPromise[project.basePath]){
return cache.loadConfigsPromise[project.basePath];
}
cache.loadConfigsPromise = {};
cache.loadConfigsPromise[project.basePath] = new Promise(function(resolve , reject){
var templateConfigPath = path.join(project.basePath, "*", "package.json");
glob(templateConfigPath, function (err, files) {
if (err) {
log.error("获取项目中package.json错误。 匹配表达式:" + templateConfigPath);
throw new Error(err);
}
resolve(files);
});
}).map(function (configFile) {
return new Promise(function (resolve, reject) {
fs.exists(configFile, function (exists) { //判断文件是否存在
resolve(exists);
});
}).then(function (exists) {
return configFile;
});
}).catch(function (e) {
log.error(e);
throw new Error(e);
});
return cache.loadConfigsPromise[project.basePath];
}
module.exports.getConfigs = getConfigs;
/**
* 装载项目的模板
* @param project
*/
function loadTemplates(project) {
var context = this.log ? this : EmptyContext;
var log = context.log;
var cache = context.cache;
if(cache.loadTemplatesPromise && cache.loadTemplatesPromise[project.basePath]){
log.info("使用项目模板缓存. 项目根路径 :"+ project.basePath);
return cache.loadTemplatesPromise[project.basePath];
}
cache.loadTemplatesPromise = {};
cache.loadTemplatesPromise[project.basePath] = getConfigs.bind(context)(project).then(function(configFiles){
var ret = [];
try {
configFiles.forEach(function (configFile) {
var tconfig = require(configFile);
if (tconfig.type == 'template') {
var basePath = path.dirname(configFile);
var Template = require("./Template").Template;
var template = new Template(basePath, project);
ret.push(template);
}
});
} catch (err) {
console.log(err);
}
return ret;
});
return cache.loadTemplatesPromise[project.basePath];
}
module.exports.loadTemplates = loadTemplates;
function loadChips(project) {
var context = this.log ? this : EmptyContext;
var log = context.log;
var cache = context.cache;
if(cache.loadChipPromise && cache.loadChipPromise[project.basePath]){
log.info("使用缓存加载碎片。项目根路径 :"+ project.basePath);
return cache.loadChipPromise[project.basePath];
}
cache.loadChipPromise = {};
cache.loadChipPromise[project.basePath] = getConfigs.bind(context)(project).then(function(configFiles){
var ret = [];
configFiles.forEach(function (configFile) {
var tconfig = require(configFile);
if (tconfig.type == 'chip') {
var basePath = path.dirname(configFile);
var Chip = require("./Chip").Chip;
ret.push(new Chip(basePath, project));
}
});
return ret;
});
return cache.loadChipPromise[project.basePath];
}
module.exports.loadChips = loadChips;
function hasPromission(project , permissionType , permission){
var context = this.log ? this : EmptyContext;
var apiFun = project._project["hasPermission"];
var data = {};
if (apiFun && _.isFunction(apiFun)) {
return apiFun.bind(context)(permissionType , permission);
}else{
return true;
}
}
function api(projectName, apiName, params) {
var context = this.log ? this : EmptyContext;
return projectLoader.loadProjects.bind(context)({name : projectName}).then(function (projects) {
if (projects && projects.length > 0) {
var project = projects[0];
var _hasPermission = hasPromission.bind(context)(project , PermissionConstant.PROJECT_API , apiName);
if(!_hasPermission){
throw new PermissionError("未授权使用项目api接口."+projectName+"."+apiName);
}
var config = project.config;
var apiList = config.exportApi;
if (typeof apiList == "undefined" || apiList.indexOf(apiName) < 0) { //如果没有暴漏相应的api则不许调用
return Promise.reject(new Error("非法调用"));
}
var apiFun = project._project[apiName];
var data = {};
if (apiFun && _.isFunction(apiFun)) {
data = apiFun.bind(context)(params);
}
return Promise.resolve(data).then(function (data) {
return data;
});
} else {
return { message: "没有匹配的数据" };
}
});
}
module.exports.api = api;