@eggjs/controller-decorator
Version:
tegg controller decorator
109 lines • 12 kB
JavaScript
"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 , , , `);
}
}
}
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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