ts-api-core
Version:
Nodejs api framework core
311 lines • 14.1 kB
JavaScript
;
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