UNPKG

ts-api-core

Version:

Nodejs api framework core

524 lines 22.3 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.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