swagger-decorator
Version:
Decorator for Koa2 and koa-router, Auto-Generate Swagger Docs
203 lines (161 loc) • 6.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _getOwnPropertyNames = require("babel-runtime/core-js/object/get-own-property-names");
var _getOwnPropertyNames2 = _interopRequireDefault(_getOwnPropertyNames);
var _keys = require("babel-runtime/core-js/object/keys");
var _keys2 = _interopRequireDefault(_keys);
var _getIterator2 = require("babel-runtime/core-js/get-iterator");
var _getIterator3 = _interopRequireDefault(_getIterator2);
exports.wrappingKoaRouter = wrappingKoaRouter;
var _paths = require("../../swagger/paths");
var _swagger = require("../../swagger/template/swagger.json");
var _swagger2 = require("../../swagger/template/swagger.html");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var path = require("path");
var debug = require("debug")("koa_router");
var methods = ["get", "post", "put", "delete", "head", "options", "del", "all"];
/**
* Description 将 router 对象的方法进行封装
* @param router 路由对象
* @param host API 域名
* @param basePath API 基本路径
* @param info 其他的 Swagger 基本信息
*/
function wrappingKoaRouter(router) {
var host = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "localhost";
var basePath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
var info = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
// 修复 SwaggerObject
if (!!info) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(info)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var key = _step.value;
_swagger.swaggerJSON["info"][key] = info[key];
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
_swagger.swaggerJSON.host = host;
_swagger.swaggerJSON.basePath = basePath;
// 设置静态请求
router.get("/swagger", function (ctx, next) {
ctx.body = (0, _swagger2.swaggerHTML)("/swagger/api.json");
});
// 设置 api.json 的请求
router.get("/swagger/api.json", function (ctx, next) {
// 构建 SwaggerJSON 文档
(0, _paths.buildSwaggerJSON)();
ctx.body = _swagger.swaggerJSON;
});
/**
* Description 扫描某个类中的所有静态方法,按照其注解将其添加到
* @param StaticClass
*/
router.scan = function (StaticClass) {
var methods = (0, _getOwnPropertyNames2.default)(StaticClass);
// 移除前三个属性 constructor、name
methods.shift();
methods.shift();
methods.shift();
// 遍历该类中的所有方法
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = (0, _getIterator3.default)(methods), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var method = _step2.value;
// 添加权限校验
router.use(basePath + StaticClass[method].path, validate(StaticClass[method]));
// 使用该类中的所有方法
router.all(StaticClass[method]);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
};
// Hook router 中的方法
methods.forEach(function (method) {
var originMethod = router[method];
// Hook 原 router 对象的方法,使其能够读取到函数的配置信息
router[method] = function (pathOrFunction, func) {
// 如果 pathOrFunction 为字符串,则表示为正常调用
if (pathOrFunction && typeof pathOrFunction === "string") {
originMethod.call(router, pathOrFunction, func);
} else {
// 这里对于路径函数进行判断
if (!pathOrFunction.method || !pathOrFunction.path) {
return;
}
// 这里执行对于路由对象的注册
router[pathOrFunction.method].call(router,
// 注意,这里仅自定义注解才添加前缀
basePath + pathOrFunction.path, pathOrFunction);
}
};
});
}
/**
* Description 从请求路径、请求体中剥离出参数并且进行校验
* - params 路径参数 ctx.params
* - query 查询参数 ctx.query
* - body ctx.request.body 使用 koa-body 中间件(https://github.com/dlau/koa-body)
* @param decoratedFunction 传入的经过注解的函数
*/
function validate(decoratedFunction) {
var _this = this;
return function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(ctx, next) {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
debug(ctx.query);
debug(ctx.params);
debug(ctx.request.body);
// 进行路径参数校验
_context.next = 5;
return next();
case 5:
case "end":
return _context.stop();
}
}
}, _callee, _this);
}));
return function (_x4, _x5) {
return _ref.apply(this, arguments);
};
}();
}