ts-api-core
Version:
Nodejs api framework core
524 lines • 22.3 kB
JavaScript
"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.BaseRouteRawWrapper = void 0;
const model_helper_1 = require("../utils/model.helper");
const base_object_1 = require("../context/base.object");
const reqest_data_1 = require("../base/reqest.data");
const base_wrapper_1 = require("./base.wrapper");
const merage_condition_1 = require("./helpers/merage.condition");
/**
* 自动化 Raw 请求数据加工基类
*/
class BaseRouteRawWrapper extends base_object_1.BaseObject {
/** 执行请求 */
executeRequest(context) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const apis = context.route.apis;
const httpRequest = [];
apis === null || apis === void 0 ? void 0 : apis.forEach((api, idx) => {
const item = this.makeHttpRequest(api, idx, context);
httpRequest.push(item);
});
if (httpRequest.length > 0) {
const [data, reqid] = yield new base_wrapper_1.BaseWrapper(context).requestApi(httpRequest);
const result = ((_a = context.route.resp) === null || _a === void 0 ? void 0 : _a.src) === undefined || context.route.resp.src === ""
? this.parserApiResult(context, context.route.resp, data)
: this.parserApiResult(context, context.route.resp, data[context.route.resp.src]);
return new base_wrapper_1.WrapperResult(result, reqid);
}
else {
return new base_wrapper_1.WrapperResult(undefined);
}
});
}
/** 生成 api 请求 */
makeHttpRequest(item, index, context) {
if (typeof item === "string") {
return new base_wrapper_1.HttpGet(item, context.query, undefined, {
checkResult: __ => true,
parser: v2 => v2,
});
}
const api = item;
const callback = api.parser === false
? {
checkResult: __ => true,
parser: v2 => v2,
}
: undefined;
const args = this.getRequestParams(context, api, api.args, api.args_opt, 0);
if (api.methed === reqest_data_1.RequestMethod.POST) {
// POST 请求
const body = this.getRequestParams(context, api, api.body, api.body_opt, 1);
return new base_wrapper_1.HttpPost(api.api, body, args, undefined, callback);
}
else {
// GET 请求
return new base_wrapper_1.HttpGet(api.api, args, undefined, callback);
}
}
/** 获取请求参数 */
getRequestParams(context, api, items, opt,
/** 是否是优先取 POST 参数 */
flag = 0) {
if (flag === 0
&& (opt === reqest_data_1.RequestItemArgsOption.AllQuery
|| opt === reqest_data_1.RequestItemArgsOption.AllQueryBody)) {
return context.query;
}
if (flag === 1
&& (opt === reqest_data_1.RequestItemArgsOption.AllBody
|| opt === reqest_data_1.RequestItemArgsOption.AllQueryBody)) {
return context.body;
}
if (opt === undefined || opt === reqest_data_1.RequestItemArgsOption.None) {
// 仅包含指定的字段
const data = {};
items === null || items === void 0 ? void 0 : items.forEach((item) => {
if (typeof item === "string") {
const srcData = flag === 0 ? context._query : context._body;
data[item] = srcData[item.toLowerCase()];
return;
}
const v = item;
data[v.name] = this.getRequestArgsItem(context, v, flag);
});
return data;
}
else {
// 排除定义的字段,暂无此需要,不作处理
return flag === 0 ? context.query : context.body;
}
}
/**
* 获取单个的参数值
* @param context
* @param v
* @param flag 是否是优先取 POST 参数
* @returns
*/
getRequestArgsItem(context, v, flag = 0) {
var _a;
const key = (_a = v.field) !== null && _a !== void 0 ? _a : v.name;
let result;
if (v.src === undefined || v.src === reqest_data_1.RequestItemArgsSource.AUTO) {
const srcData = flag === 0 ? context._query : context._body;
const spareData = flag === 0 ? context._body : context._query;
if (v.all_src === true) {
result = srcData !== null && srcData !== void 0 ? srcData : spareData;
}
else {
if (srcData) {
result = srcData[key.toLowerCase()];
}
if (!result && spareData) {
result = spareData[key.toLowerCase()];
}
}
}
else if (v.src === reqest_data_1.RequestItemArgsSource.QUERY) {
if (v.all_src === true) {
result = context.query;
}
else {
result = context._query
? context._query[key.toLowerCase()]
: undefined;
}
}
else if (v.src === reqest_data_1.RequestItemArgsSource.FIXED) {
result = v.default;
}
else if (v.all_src === true) {
result = context.body;
}
else {
result = context._body
? context._body[key.toLowerCase()]
: undefined;
}
if (result && v.type && v.type !== reqest_data_1.RequestParamType.StringType) {
if (v.type === reqest_data_1.RequestParamType.IntType || v.type === reqest_data_1.RequestParamType.NumberType) {
result = Number(result);
}
else if (v.type === reqest_data_1.RequestParamType.BoolType) {
result = result === '1' || String(result).toLowerCase() === 'true';
}
}
result = result === undefined ? v.default : result;
if (v.ignore === result || (v.ignoreNot !== undefined && result !== v.ignoreNot)) {
result = undefined;
}
return result;
}
/** 获取对象中指定路径字段(以"`.`"分隔)的值 */
getValueByPath(data, path, ignoreCase = true, deleteSrc = false) {
if (!data || !path) {
return undefined;
}
const e = path.split(".");
let result = data;
let _result = ignoreCase ? this.toLowercaseKey(result) : result;
let i = 0;
let parent;
let pKey;
while (i < e.length) {
const item = e[i];
if (typeof result === 'object') {
parent = result;
pKey = item;
result = ignoreCase ? _result[item.toLowerCase()] : _result[item];
if (!result) {
break;
}
_result = ignoreCase ? this.toLowercaseKey(result) : result;
}
else {
return undefined;
}
i = i + 1;
}
if (deleteSrc && parent && pKey) {
// 删除原数据中的字段
if (parent[pKey]) {
parent[pKey] = undefined;
}
else if (ignoreCase) {
// 大小写不匹配
const lowerCaseKey = pKey.toLowerCase();
Object.keys(parent).forEach((key) => {
if (key.toLowerCase() === lowerCaseKey) {
parent[key] = undefined;
}
});
}
}
return result;
}
/**
* 解析返回数据
* @param data RequestApi 返回的 Data
*/
// eslint-disable-next-line max-params
parserApiResult(context, respConfig, data, needHumpConv = true, customValues, isArrayModel = false, arrayConvert) {
var _a, _b;
if (!data || !respConfig) {
return data;
}
const datas = Array.isArray(data) ? data : [data];
// 不使用驼峰时,就不做小写转化
const _datas = !needHumpConv || ((_a = context.route.config) === null || _a === void 0 ? void 0 : _a.hump) === false
? datas
: this.transKeyToLowercase(datas);
const fields = respConfig.fields;
const merage = Number(respConfig.merage);
// 不需要自动合并字段
const notMerageAll = Number.isNaN(merage) || merage < 0;
// 没有配置字段信息时
if (!fields) {
if (notMerageAll) {
return isArrayModel ? [] : undefined;
}
// 返回全部数据
if (isArrayModel && customValues) {
const list = [];
if (Array.isArray(customValues)) {
customValues.forEach((item) => {
let value = {};
model_helper_1.ModelHelper.initModel(item, value, true, true);
if (arrayConvert) {
value = arrayConvert(item, value);
if (value === undefined) {
return;
}
}
list.push(value);
});
}
else {
let value = {};
model_helper_1.ModelHelper.initModel(customValues, value, true, true);
if (arrayConvert) {
value = arrayConvert(customValues, value);
if (value !== undefined) {
list.push(value);
}
}
else {
list.push(value);
}
}
return list;
}
else {
if (((_b = context.route.config) === null || _b === void 0 ? void 0 : _b.hump) === false) {
return customValues !== null && customValues !== void 0 ? customValues : data;
}
const value = {};
model_helper_1.ModelHelper.initModel((customValues !== null && customValues !== void 0 ? customValues : data), value, true, true);
return value;
}
}
if (isArrayModel === true || respConfig.array === true) {
const list = [];
const arrayValues = customValues
? (Array.isArray(customValues) ? customValues : [customValues])
: (respConfig.array === true ? (Array.isArray(data) ? data : [data]) : undefined);
arrayValues === null || arrayValues === void 0 ? void 0 : arrayValues.forEach((item) => {
if (Array.isArray(fields)) {
// 配置的字段为数组,返回一个对象
let v = {};
fields.forEach((field) => {
this.initResultField(v, field, _datas, context, item);
});
if (!notMerageAll) {
this.merageData(_datas, item, v, merage, respConfig.condition);
}
if (arrayConvert) {
v = arrayConvert(item, v);
if (v === undefined) {
return;
}
}
list.push(v);
}
else {
let v = this.initResultField(undefined, fields, _datas, context, item);
if (arrayConvert) {
v = arrayConvert(item, v);
if (v === undefined) {
return;
}
}
list.push(v);
}
});
return list;
}
else if (Array.isArray(fields)) {
// 配置的字段为数组,返回一个对象
const v = {};
fields.forEach((field) => {
this.initResultField(v, field, _datas, context, customValues);
});
if (!notMerageAll) {
this.merageData(_datas, customValues, v, merage, respConfig.condition);
}
return v;
}
else {
return this.initResultField(undefined, fields, _datas, context, customValues);
}
}
/** 初始化返回数据 */
initResultField(obj, field,
/** 原始的数据列表 */
datas,
/** 请求上下文 */
context, customValues) {
var _a, _b;
if (typeof field === "string") {
const value = datas.length > 0 && datas[0]
? datas[0][field.toLowerCase()]
: undefined;
if (obj) {
obj[field] = value;
}
return value;
}
else {
const fv = field;
const apiIndex = fv.api === undefined ? undefined : Number(fv.api);
let srcData;
switch (apiIndex) {
case reqest_data_1.RequestResultValue.QUERY:
srcData = context._query;
break;
case reqest_data_1.RequestResultValue.BODY:
srcData = context._body;
break;
case reqest_data_1.RequestResultValue.FIXED:
srcData = (_a = fv.default) !== null && _a !== void 0 ? _a : customValues;
break;
default:
if (apiIndex === undefined
|| Number.isNaN(apiIndex)
|| apiIndex < 0) {
// 未设置或无效设置,取第1个api的返回值
srcData = customValues !== null && customValues !== void 0 ? customValues : datas[0];
}
else {
srcData = datas[apiIndex];
}
break;
}
let value = fv.all_src === true
? srcData
: (srcData ? this.getValueByPath(srcData, ((_b = fv.src) !== null && _b !== void 0 ? _b : fv.name).toLowerCase(), true, !!fv.src) : undefined);
// 清除原数据中有命名变换的字段
if (value && fv.src && fv.all_src !== true && srcData) {
}
if (fv.children) {
// 取的固定值时,如果取出的值为空,则继续使用原数据
const _value = (!value && apiIndex === reqest_data_1.RequestResultValue.FIXED ? srcData : value);
const _convertCallBack = fv.convert ? (item, vv) => {
return this.converterResultValue(fv.convert, fv.convert_param, item, vv);
} : undefined;
if (fv.array === true || fv.array === 1) {
const result = this.parserApiResult(context, fv.children, datas, false, _value, true, _convertCallBack);
if (obj) {
obj[fv.name] = result;
}
return result;
}
else if ((fv.type === undefined || fv.type === reqest_data_1.RequestParamType.ObjectType) && typeof _value === 'object') {
const result = this.parserApiResult(context, fv.children, datas, false, _value, false, _convertCallBack);
if (obj) {
obj[fv.name] = result;
}
return result;
}
else if (fv.convert) {
value = this.converterResultValue(fv.convert, fv.convert_param, srcData, value);
}
}
else if (fv.convert) {
value = this.converterResultValue(fv.convert, fv.convert_param, srcData, value);
}
if (obj) {
obj[fv.name] = value;
}
return value;
}
}
converterResultValue(convert, convert_param, owner, value) {
if (convert) {
const converterCls = this.getConverter(convert);
if (converterCls) {
try {
const converter = convert_param ? new converterCls(...convert_param) : new converterCls();
converter.data = owner;
return converter.execute(value);
}
catch (e) {
// eslint-disable-next-line no-console
console.log(e);
}
}
}
return value;
}
/** 获取转换器 */
getConverter(type) {
switch (type) {
case reqest_data_1.RequestResultConvert.ExcludeField: return model_helper_1.ExcludeFieldSrcConverter;
case reqest_data_1.RequestResultConvert.ValueFilter: return model_helper_1.EqualValueFilterSrcConverter;
case reqest_data_1.RequestResultConvert.BoolValue: return model_helper_1.BoolValueSrcConverter;
case reqest_data_1.RequestResultConvert.BoolCalc: return model_helper_1.BoolCalcSrcConverter;
case reqest_data_1.RequestResultConvert.INT: return model_helper_1.IntSrcConverter;
case reqest_data_1.RequestResultConvert.JSON: return model_helper_1.JsonObjectSrcConverter;
case reqest_data_1.RequestResultConvert.DATE: return model_helper_1.DateSrcConverter;
case reqest_data_1.RequestResultConvert.SubObject: return model_helper_1.SubObjectConverter;
}
return undefined;
}
/**
* 合并的源数据
* @param srcDatas 源数据数组
* @param merage 源数据索引号
* @param condition 合并条件配置
* @param fields 返回配置的字段信息,需要将配置中有命名变换的字段从合并后的结果中排除
* @returns
*/
merageData(srcDatas, customValues, curValue, merage, condition) {
let data = merage < srcDatas.length ? srcDatas[merage] : customValues;
if (condition) {
const conditionCls = this.getConditionHandler(condition.type);
if (conditionCls) {
const e = condition.args ? new conditionCls(...condition.args) : new conditionCls();
data = e.execute(data, curValue);
}
}
if (!Array.isArray(data)) {
model_helper_1.ModelHelper.initModel(data, curValue, true, true);
}
}
/** 获取自动合并条件处理器 */
getConditionHandler(type) {
switch (type) {
case reqest_data_1.RequestResultMarageCondition.GetObjectArrayItem: return merage_condition_1.GetObjectArrayItemCondition;
}
return undefined;
}
/** 将数据列表的 key 转为小写 */
transKeyToLowercase(datas) {
const _datas = [];
datas.forEach((dataItem) => {
_datas.push(this.toLowercaseKey(dataItem));
});
return _datas;
}
/** 将对象的关键字 key 转为小写 */
toLowercaseKey(dataItem) {
if (Array.isArray(dataItem)) {
const ds = [];
dataItem.forEach((vv) => {
const _item = {};
Object.keys(vv).forEach((e) => {
_item[e.toLowerCase()] = vv[e];
});
ds.push(vv);
});
return ds;
}
else if (typeof dataItem === "object") {
const _newItem = {};
Object.keys(dataItem).forEach((e) => {
_newItem[e.toLowerCase()] = dataItem[e];
});
return _newItem;
}
else {
return dataItem;
}
}
/** 获取根据返回配置的字段名称,获取字段配置 */
getFieldByName(resp, name) {
if (resp === null || resp === void 0 ? void 0 : resp.fields) {
if (typeof resp.fields === 'string') {
return resp.fields === name ? resp.fields : undefined;
}
else if (Array.isArray(resp.fields)) {
let i = 0;
while (i < resp.fields.length) {
const item = resp.fields[i];
if (typeof item === 'string') {
if (item === name) {
return item;
}
}
else if (item.name === name) {
return item;
}
i = i + 1;
}
}
else if (typeof resp.fields === 'object' && resp.fields.name === name) {
return resp.fields;
}
}
return undefined;
}
}
exports.BaseRouteRawWrapper = BaseRouteRawWrapper;
//# sourceMappingURL=base.route.raw.wrapper.js.map