UNPKG

swagger-decorator

Version:
203 lines (161 loc) 6.12 kB
"use strict"; 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); }; }(); }