UNPKG

nyx_server

Version:

Node内容发布

160 lines (144 loc) 5.71 kB
/* 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;