yapi/server/plugin.js

274 lines
6.1 KiB
JavaScript
Raw Permalink Normal View History

2017-09-05 10:24:13 +08:00
const yapi = require('./yapi.js');
2017-09-28 20:26:54 +08:00
const plugin_path = yapi.path.join(yapi.WEBROOT, 'node_modules');
2017-09-17 13:36:51 +08:00
const plugin_system_path = yapi.path.join(yapi.WEBROOT, 'exts');
2017-11-27 20:11:28 +08:00
const initPlugins = require('../common/plugin.js').initPlugins;
2017-09-17 13:36:51 +08:00
var extConfig = require('../common/config.js').exts;
2017-09-25 00:07:23 +08:00
/**
* 钩子配置
*/
2017-09-05 17:04:59 +08:00
var hooks = {
2018-07-31 19:45:01 +08:00
/**
* 第三方sso登录钩子暂只支持设置一个
* @param ctx
* @return 必需返回一个 promise 对象resolve({username: '', email: ''})
*/
third_login: {
type: 'single',
listener: null
},
/**
* 客户端增加接口成功后触发
2018-08-03 14:22:49 +08:00
* @param data 接口的详细信息
2018-07-31 19:45:01 +08:00
*/
interface_add: {
type: 'multi',
listener: []
},
/**
* 客户端删除接口成功后触发
* @param data 接口id
2018-07-31 19:45:01 +08:00
*/
interface_del: {
type: 'multi',
listener: []
},
/**
* 客户端更新接口成功后触发
* @param id 接口id
*/
interface_update: {
type: 'multi',
listener: []
},
/**
* 客户端获取接口数据列表
2018-08-03 14:22:49 +08:00
* @param list 返回接口的数据列表
2018-07-31 19:45:01 +08:00
*/
interface_list: {
type: 'multi',
listener: []
},
/**
* 客户端获取一条接口信息触发
2018-08-03 14:22:49 +08:00
* @param data 接口的详细信息
2018-07-31 19:45:01 +08:00
*/
interface_get: {
type: 'multi',
listener: []
},
/**
* 客户端增加一个新项目
* @param id 项目id
*/
project_add: {
type: 'multi',
listener: []
},
2018-09-03 10:50:36 +08:00
/**
* 客户端更新一个新项目
* @param id 项目id
*/
project_up: {
type: 'multi',
listener: []
},
2018-09-03 14:19:14 +08:00
/**
* 客户端获取一个项目
* @param id 项目id
*/
project_get: {
type: 'multi',
listener: []
},
2018-07-31 19:45:01 +08:00
/**
* 客户端删除删除一个项目
* @param id 项目id
*/
project_del: {
type: 'multi',
listener: []
},
/**
* 导出 markdown 数据
* @param context Object
* {
* projectData: project,
interfaceData: interfaceData,
ctx: ctx,
mockJson: res
* }
*
*/
2018-07-31 19:45:01 +08:00
export_markdown: {
type: 'multi',
listener: []
},
/**
2017-09-25 00:07:23 +08:00
* MockServer生成mock数据后触发
* @param context Object
* {
* projectData: project,
interfaceData: interfaceData,
ctx: ctx,
mockJson: res
* }
*
*/
2018-07-31 19:45:01 +08:00
mock_after: {
type: 'multi',
listener: []
},
/**
* 增加路由的钩子
* type Sync
* @param addPluginRouter Function
* @info
* addPLuginPLugin(config)
*
* config = {
* path, // String 路由名称
* method, // String 请求方法 get post ...
* controller // Class 继承baseController的class
* action // String controller的Action
* }
*
* 示例
* config = {
* path: "export/pdf",
* method: "get",
* controller: controller,
* action: "exportPdf"
* }
*/
add_router: {
type: 'multi',
listener: []
},
/**
* 增加websocket路由的钩子
* type Sync
* @param addPluginRouter Function
* @info
* addPLuginPLugin(config)
*
* config = {
* path, // String 路由名称
* method, // String 请求方法 get post ...
* controller // Class 继承baseController的class
* action // String controller的Action
* }
*
* 示例
* config = {
* path: "export/pdf",
* method: "get",
* controller: controller,
* action: "exportPdf"
* }
*/
add_ws_router: {
type: 'multi',
listener: []
},
import_data: {
type: 'multi',
listener: []
2019-08-01 11:50:02 +08:00
},
2019-08-01 11:52:21 +08:00
/**
* addNoticePlugin(config)
*
* config.weixin = {
* title: 'wechat',
* hander: (emails, title, content)=> {...}
* }
*/
2019-08-01 11:50:02 +08:00
addNotice:{
type: 'multi',
listener: []
2018-07-31 19:45:01 +08:00
}
2017-09-05 17:04:59 +08:00
};
2017-09-17 13:36:51 +08:00
function bindHook(name, listener) {
2018-07-31 19:45:01 +08:00
if (!name) throw new Error('缺少hookname');
if (name in hooks === false) {
throw new Error('不存在的hookname');
}
if (hooks[name].type === 'multi') {
hooks[name].listener.push(listener);
} else {
if (typeof hooks[name].listener === 'function') {
throw new Error('重复绑定singleHook(' + name + '), 请检查');
2017-09-17 13:36:51 +08:00
}
2018-07-31 19:45:01 +08:00
hooks[name].listener = listener;
}
2017-09-05 17:04:59 +08:00
}
/**
2018-07-31 19:45:01 +08:00
*
* @param {*} hookname
2018-07-31 19:45:01 +08:00
* @return promise
*/
function emitHook(name) {
2018-07-31 19:45:01 +08:00
if (hooks[name] && typeof hooks[name] === 'object') {
let args = Array.prototype.slice.call(arguments, 1);
if (hooks[name].type === 'single' && typeof hooks[name].listener === 'function') {
return Promise.resolve(hooks[name].listener.apply(yapi, args));
2017-09-17 13:36:51 +08:00
}
2018-07-31 19:45:01 +08:00
let promiseAll = [];
if (Array.isArray(hooks[name].listener)) {
let listenerList = hooks[name].listener;
for (let i = 0, l = listenerList.length; i < l; i++) {
promiseAll.push(Promise.resolve(listenerList[i].apply(yapi, args)));
}
}
return Promise.all(promiseAll);
}
2017-09-05 17:04:59 +08:00
}
yapi.bindHook = bindHook;
yapi.emitHook = emitHook;
yapi.emitHookSync = emitHook;
2017-09-17 13:36:51 +08:00
2017-10-05 09:12:44 +08:00
let pluginsConfig = initPlugins(yapi.WEBCONFIG.plugins, 'plugin');
2017-09-17 13:36:51 +08:00
pluginsConfig.forEach(plugin => {
2018-07-31 19:45:01 +08:00
if (!plugin || plugin.enable === false || plugin.server === false) return null;
if (
!yapi.commons.fileExist(
yapi.path.join(plugin_path, 'yapi-plugin-' + plugin.name + '/server.js')
)
) {
throw new Error(`config.json配置了插件${plugin},但plugins目录没有找到此插件请安装此插件`);
}
let pluginModule = require(yapi.path.join(
plugin_path,
'yapi-plugin-' + plugin.name + '/server.js'
));
pluginModule.call(yapi, plugin.options);
});
2017-09-17 13:36:51 +08:00
2017-10-05 09:12:44 +08:00
extConfig = initPlugins(extConfig, 'ext');
2017-09-17 13:36:51 +08:00
extConfig.forEach(plugin => {
2018-07-31 19:45:01 +08:00
if (!plugin || plugin.enable === false || plugin.server === false) return null;
if (
!yapi.commons.fileExist(
yapi.path.join(plugin_system_path, 'yapi-plugin-' + plugin.name + '/server.js')
)
) {
throw new Error(`config.json配置了插件${plugin},但plugins目录没有找到此插件请安装此插件`);
}
let pluginModule = require(yapi.path.join(
plugin_system_path,
'yapi-plugin-' + plugin.name + '/server.js'
));
pluginModule.call(yapi, plugin.options);
});
2017-09-17 13:36:51 +08:00
//delete bindHook方法避免误操作
2018-07-31 19:45:01 +08:00
delete yapi.bindHook;