UNPKG

@eggjs/controller-decorator

Version:

tegg controller decorator

109 lines 12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.HTTPControllerMethodMetaBuilder = void 0; const node_path_1 = __importDefault(require("node:path")); const tegg_metadata_1 = require("@eggjs/tegg-metadata"); const model_1 = require("../../model"); const MethodValidator_1 = require("../../util/validator/MethodValidator"); const HTTPInfoUtil_1 = __importDefault(require("../../util/HTTPInfoUtil")); const MethodInfoUtil_1 = __importDefault(require("../../util/MethodInfoUtil")); const HTTPPriorityUtil_1 = require("../../util/HTTPPriorityUtil"); class HTTPControllerMethodMetaBuilder { constructor(clazz, methodName) { this.clazz = clazz; this.methodName = methodName; } // 检查 HTTP 方法上参数是否都加上了注解 // foo(a, b=233, c); foo.length = 2; // 由于这种情况的存在, 所以需要对 function 参数检查进行特殊处理 // 如果有注解的参数比 function.length 长, 长度应该取有注解参数总数(包括 @Context) // // 但是有两种特殊情况无法处理 // foo(@Context() ctx, @HTTPParam() id1, id2 = 233) // foo(@Context() ctx, @HTTPParam() id1, id2 = 233, id3) // 这两种情况均为默认值参数在 checkParamDecorators() { const method = this.clazz.prototype[this.methodName]; // 获取函数参数长度 const functionLength = method.length; // 计算带注解参数 const paramIndexList = HTTPInfoUtil_1.default.getParamIndexList(this.clazz, this.methodName); const contextIndex = MethodInfoUtil_1.default.getMethodContextIndex(this.clazz, this.methodName); const hasAnnotationParamCount = typeof contextIndex === 'undefined' ? paramIndexList.length : paramIndexList.length + 1; const maxParamCount = Math.max(functionLength, hasAnnotationParamCount); for (let i = 0; i < maxParamCount; ++i) { // 上下文参数, 跳过检查 if (i === contextIndex) { continue; } const paramType = HTTPInfoUtil_1.default.getHTTPMethodParamType(i, this.clazz, this.methodName); if (!paramType) { const classDesc = tegg_metadata_1.ClassUtil.classDescription(this.clazz); throw new Error(`${classDesc}:${this.methodName} param ${i} has no http param type, Please add @HTTPBody, @HTTPParam, @HTTPQuery, @HTTPQueries`); } } } buildParamType(httpPath) { this.checkParamDecorators(); const paramTypeMap = new Map(); const paramIndexList = HTTPInfoUtil_1.default.getParamIndexList(this.clazz, this.methodName); for (const paramIndex of paramIndexList) { const paramType = HTTPInfoUtil_1.default.getHTTPMethodParamType(paramIndex, this.clazz, this.methodName); const paramName = HTTPInfoUtil_1.default.getHTTPMethodParamName(paramIndex, this.clazz, this.methodName); const paramMeta = model_1.ParamMetaUtil.createParam(paramType, paramName); try { paramMeta.validate(httpPath); } catch (e) { const classDesc = tegg_metadata_1.ClassUtil.classDescription(this.clazz); e.message = `build controller ${classDesc} method ${this.methodName} param ${paramName} failed: ${e.message}`; throw e; } paramTypeMap.set(paramIndex, paramMeta); } return paramTypeMap; } getPriority() { const priority = HTTPInfoUtil_1.default.getHTTPMethodPriority(this.clazz, this.methodName); if (priority !== undefined) { return priority; } const controllerPath = HTTPInfoUtil_1.default.getHTTPPath(this.clazz); const methodPath = HTTPInfoUtil_1.default.getHTTPMethodPath(this.clazz, this.methodName); const realPath = controllerPath ? node_path_1.default.posix.join(controllerPath, methodPath) : methodPath; const defaultPriority = HTTPPriorityUtil_1.HTTPPriorityUtil.calcPathPriority(realPath); if (defaultPriority > HTTPPriorityUtil_1.HTTPPriorityUtil.DEFAULT_PRIORITY) { throw new Error(`path ${realPath} is too long, should set priority manually`); } return defaultPriority; } build() { MethodValidator_1.MethodValidator.validate(this.clazz, this.methodName); const controllerType = MethodInfoUtil_1.default.getMethodControllerType(this.clazz, this.methodName); if (!controllerType) { return undefined; } const httpMethod = HTTPInfoUtil_1.default.getHTTPMethodMethod(this.clazz, this.methodName); const parentPath = HTTPInfoUtil_1.default.getHTTPPath(this.clazz); const httpPath = HTTPInfoUtil_1.default.getHTTPMethodPath(this.clazz, this.methodName); const contextIndex = MethodInfoUtil_1.default.getMethodContextIndex(this.clazz, this.methodName); const middlewares = MethodInfoUtil_1.default.getMethodMiddlewares(this.clazz, this.methodName); const needAcl = MethodInfoUtil_1.default.hasMethodAcl(this.clazz, this.methodName); const aclCode = MethodInfoUtil_1.default.getMethodAcl(this.clazz, this.methodName); const hosts = MethodInfoUtil_1.default.getMethodHosts(this.clazz, this.methodName); const timeout = MethodInfoUtil_1.default.getMethodTimeout(this.clazz, this.methodName); const realPath = parentPath ? node_path_1.default.posix.join(parentPath, httpPath) : httpPath; const paramTypeMap = this.buildParamType(realPath); const priority = this.getPriority(); return new model_1.HTTPMethodMeta(this.methodName, httpPath, httpMethod, middlewares, contextIndex, paramTypeMap, priority, needAcl, aclCode, hosts, timeout); } } exports.HTTPControllerMethodMetaBuilder = HTTPControllerMethodMetaBuilder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSFRUUENvbnRyb2xsZXJNZXRob2RNZXRhQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbXBsL2h0dHAvSFRUUENvbnRyb2xsZXJNZXRob2RNZXRhQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBNkI7QUFDN0Isd0RBQWlEO0FBRWpELHVDQUF1RTtBQUN2RSwwRUFBdUU7QUFDdkUsMkVBQW1EO0FBQ25ELCtFQUF1RDtBQUN2RCxrRUFBK0Q7QUFFL0QsTUFBYSwrQkFBK0I7SUFJMUMsWUFBWSxLQUF3QixFQUFFLFVBQWtCO1FBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsb0NBQW9DO0lBQ3BDLHVDQUF1QztJQUN2Qyx5REFBeUQ7SUFDekQsRUFBRTtJQUNGLGdCQUFnQjtJQUNoQixtREFBbUQ7SUFDbkQsd0RBQXdEO0lBQ3hELGdCQUFnQjtJQUNSLG9CQUFvQjtRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckQsV0FBVztRQUNYLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFckMsVUFBVTtRQUNWLE1BQU0sY0FBYyxHQUFHLHNCQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkYsTUFBTSxZQUFZLEdBQUcsd0JBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RixNQUFNLHVCQUF1QixHQUFHLE9BQU8sWUFBWSxLQUFLLFdBQVc7WUFDakUsQ0FBQyxDQUFDLGNBQWMs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