UNPKG

ts-api-core

Version:

Nodejs api framework core

311 lines 14.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseRouteRawController = void 0; const model_helper_1 = require("../utils/model.helper"); const mvc_error_1 = require("../mvc/validation/mvc.error"); const integer_validator_1 = require("../mvc/validation/validator/integer.validator"); const length_validator_1 = require("../mvc/validation/validator/length.validator"); const mobile_validator_1 = require("../mvc/validation/validator/mobile.validator"); const number_validator_1 = require("../mvc/validation/validator/number.validator"); const pick_validator_1 = require("../mvc/validation/validator/pick.validator"); const required_validator_1 = require("../mvc/validation/validator/required.validator"); const reqest_data_1 = require("../base/reqest.data"); const result_1 = require("../base/result"); const base_route_raw_wrapper_1 = require("../wrapper/base.route.raw.wrapper"); const base_controller_1 = require("./base.controller"); /** Raw 类型请求 Controller */ class BaseRouteRawController extends base_controller_1.BaseController { /** 执行请求 */ executeRequest(context) { var _a; return __awaiter(this, void 0, void 0, function* () { this.validateParam(context); if (this.canExecuteWrapper(context)) { const wrapper = this.getWrapper(context); return this.executeWrapper(wrapper.executeRequest(context)); } // 不需要调用 api 时,直接返回定义的 result return result_1.Result.success((_a = context.route.result) !== null && _a !== void 0 ? _a : { query: context.query, body: context.body }, context.reqId); }); } /** 是否可以执行 wrapper */ canExecuteWrapper(context) { return !!(context.route.apis && context.route.apis.length > 0); } /** 获取 Wrapper */ getWrapper(context) { return new base_route_raw_wrapper_1.BaseRouteRawWrapper(context); } /** 参数校验 */ validateParam(context) { // 处理 Query 参数 if (context.route.query) { this.validateQueryParam(context.route.query, context); } else { context.query = context.req.query; } // 处理 if (context.route.body) { this.validateBodyParam(context.route.body, context); } else { context.body = context.req.body; } } /** 校验 Query 参数 */ validateQueryParam(query, context) { var _a; const config = (_a = context.route.config) !== null && _a !== void 0 ? _a : BaseRouteRawController.defaultRequestConfig; context.query = this.validateParams(context, context.req, 'query', query, config); context._query = this.transKeyToLowercase(context.query); } /** 校验 Body 参数 */ validateBodyParam(body, context) { var _a; const config = (_a = context.route.config) !== null && _a !== void 0 ? _a : BaseRouteRawController.defaultRequestConfig; const bodys = Array.isArray(body) ? body : [body]; context.body = this.validateParams(context, context.req, 'body', bodys, config); context._body = this.transKeyToLowercase(context.body); } /** 参数校验 */ validateParams(context, parent, srcKey, params, config) { var _a; const src = new Map(); const rawSrc = (_a = parent[srcKey]) !== null && _a !== void 0 ? _a : {}; for (const key in rawSrc) { src.set(key.toLowerCase(), rawSrc[key]); } const data = {}; if (config.exclude === true || config.exclude === 1) { // 排除指定的字段 params.forEach((item, idx) => { var _a; if (!item) { return; } if (typeof item === 'string') { src.delete(item.toLowerCase()); } else { const rp = item; const key = ((_a = rp.src) !== null && _a !== void 0 ? _a : rp.name).toLowerCase(); if (key) { src.delete(key); } } }); for (const key in rawSrc) { if (src.has(key.toLowerCase())) { data[key] = rawSrc[key]; } } } else { params.forEach((item, idx) => { var _a, _b, _c; if (!item) { return; } if (typeof item === "string") { if (!this.isDynamicField(item)) { data[item] = src.get(item.toLowerCase()); } return; } const vv = item; if (!vv.name || this.isDynamicField(vv.name)) { return; } const rawKey = (_a = vv.src) !== null && _a !== void 0 ? _a : vv.name; if (vv.validate) { let _value = src.get(rawKey.toLowerCase()); if (_value === undefined) { _value = vv.default; } const args = [vv.validate, vv.name, _value]; (_b = vv.validate_value) === null || _b === void 0 ? void 0 : _b.forEach((v2) => { args.push(v2); }); // eslint-disable-next-line prefer-spread data[vv.name] = this.executeValidate.apply(this, args); } else { data[vv.name] = src.get(rawKey.toLowerCase()); } if (vv.must === true || vv.must === 1) { const value = (_c = data[vv.name]) !== null && _c !== void 0 ? _c : vv.default; if (value === undefined || value === "") { throw new mvc_error_1.ParamError(vv.name + "参数为空或不存在"); } } const value = data[vv.name]; const isArrayValue = vv.array === true || vv.array === 1; if (value !== undefined && vv.array !== 2) { if (Array.isArray(value)) { if (!isArrayValue) { throw new mvc_error_1.ParamError(vv.name + "参数不能是数组"); } } else if (isArrayValue) { throw new mvc_error_1.ParamError(vv.name + "参数必须是数组"); } } if (value === undefined) { data[vv.name] = vv.default; } else if (vv.type === reqest_data_1.RequestParamType.NumberType || vv.type === reqest_data_1.RequestParamType.IntType) { // 数字转换 data[vv.name] = Number(value); } else if (vv.type === reqest_data_1.RequestParamType.BoolType) { // 布尔转换 data[vv.name] = value === 1 || value === true || (typeof value === 'string' && (value.toLowerCase() === "true" || value.toLowerCase() === "yes")); } else if (vv.type === reqest_data_1.RequestParamType.DateType) { // 日期转换 data[vv.name] = value === undefined || value === null ? undefined : Date.toDate(value); } else { if (vv.children) { // 子对象处理 const rawChildren = vv.children; const children = Array.isArray(rawChildren) ? rawChildren : [rawChildren]; if ((isArrayValue || vv.array === 2) && Array.isArray(value)) { value.forEach((_, i) => { const newValue = this.validateParams(context, value, i, children, config); value[i] = newValue; }); } else { if (Array.isArray(value)) { data[vv.name] = value.length > 0 ? value[0] : undefined; // 如果需要的值不是数组,传入的是数组,那么使用数组的第1个元素 } data[vv.name] = this.validateParams(context, data, vv.name, children, config); } } else { // 字符串转换 if (!isArrayValue && vv.array !== 2 && (vv.type === undefined || vv.type === reqest_data_1.RequestParamType.StringType)) { if (typeof value === 'object') { data[vv.name] = JSON.stringify(value); } } } } }); } if (config.merage === true || config.merage === 1) { model_helper_1.ModelHelper.initModel(rawSrc, data, true, true); return data; } else { return data; } } /** 检测是否为动态字段 */ isDynamicField(name) { const i = name.indexOf("["); return i > 0 && name.indexOf("]") > i; } /** 获取参数校验器类 */ getValidator(validate) { switch (validate) { case reqest_data_1.RequestParamValidate.NumberValidator: return number_validator_1.NumberValidator; case reqest_data_1.RequestParamValidate.IntValidator: return integer_validator_1.IntegerValidator; case reqest_data_1.RequestParamValidate.PickValidator: return pick_validator_1.PickValidator; case reqest_data_1.RequestParamValidate.MobileValidator: return mobile_validator_1.MobileValidator; case reqest_data_1.RequestParamValidate.RequiredValidator: return required_validator_1.RequiredValidator; case reqest_data_1.RequestParamValidate.LengthValidator: return length_validator_1.LengthValidator; case reqest_data_1.RequestParamValidate.PageIndexValidator: return number_validator_1.PageIndexValidator; case reqest_data_1.RequestParamValidate.PageSizeValidator: return number_validator_1.PageSizeValidator; } } /** 执行参数校验器 */ executeValidate(validate, fieldName, value, ...args) { const validatorCls = this.getValidator(validate); let dataValue = value; try { if (!validatorCls) { return value; } const validator = new validatorCls(...args); if (value === undefined || value === "" || Number.isNaN(value)) { const defaultValue = validator.getDefaultValue(); if (defaultValue === undefined && validator.isMust()) { throw new mvc_error_1.ParamError(fieldName + "参数为空或不存在"); } else { return defaultValue; } } else if (!validator.valid(value, (vv) => { dataValue = vv; })) { const text = validator.getMessage(); throw new mvc_error_1.ParamError(fieldName + text); } return dataValue; } catch (ex) { console.error(ex); mvc_error_1.BaseError.throwError(ex, "处理参数校验", ex.message); } } /** 把对象的key转成小写 */ transKeyToLowercase(data) { if (!data) { return data; } if (Array.isArray(data)) { const obj = []; data.forEach((value) => { if (Array.isArray(value) || typeof value === 'object') { obj.push(this.transKeyToLowercase(value)); } else { obj.push(value); } }); return obj; } else if (typeof data === 'object') { const obj = {}; for (const key in data) { const value = data[key]; if (Array.isArray(value) || typeof value === 'object') { obj[key.toLowerCase()] = this.transKeyToLowercase(value); } else { obj[key.toLowerCase()] = value; } } return obj; } else { return data; } } } exports.BaseRouteRawController = BaseRouteRawController; /** 默认请求配置 */ BaseRouteRawController.defaultRequestConfig = new reqest_data_1.RequestConfig(); //# sourceMappingURL=base.route.raw.controller.js.map