UNPKG

@zohocrm/typescript-sdk-6.0

Version:
792 lines (791 loc) 43.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.JSONConverter = void 0; const sdk_exception_1 = require("../../core/com/zoho/crm/api/exception/sdk_exception"); const record_1 = require("../../core/com/zoho/crm/api/record/record"); const initializer_1 = require("../../routes/initializer"); const constants_1 = require("./constants"); const converter_1 = require("./converter"); const datatype_converter_1 = require("./datatype_converter"); const choice_1 = require("./choice"); const utility_1 = require("./utility"); const path_1 = require("path"); const fs_1 = require("fs"); /** * This class processes the API response to the object and an object to a JSON object, containing the request body. */ class JSONConverter extends converter_1.Converter { constructor(commonAPIHandler) { super(commonAPIHandler); this.uniqueValuesMap = new Map(); } async appendToRequest(requestBase) { let request = requestBase; return JSON.stringify(request.getRequestBody(), (key, value) => typeof value === constants_1.Constants.BIGINT_TYPE ? value.toString() : value); } async formRequest(requestInstance, pack, instanceNumber, memberDetail) { var classDetail = initializer_1.Initializer.jsonDetails[pack]; if (classDetail.hasOwnProperty(constants_1.Constants.INTERFACE) && classDetail[constants_1.Constants.INTERFACE] === true) { var classes = classDetail[constants_1.Constants.CLASSES]; var baseName = pack.split('/').slice(0, -1); let className = await this.getFileName(requestInstance.constructor.name).catch((err) => { throw err; }); baseName.push(className); let fileName = requestInstance.constructor.name; let fileNameArray = fileName.split(/(?=[A-Z])/); baseName[5] = fileNameArray[0].toLowerCase() + "_" + fileNameArray[1].toLowerCase() + "s"; let requestObjectClassName = baseName.join('/'); for (let className1 in classes) { if (classes[className1].toLowerCase() == requestObjectClassName) { classDetail = initializer_1.Initializer.jsonDetails[requestObjectClassName]; break; } } } if (requestInstance instanceof record_1.Record) { let moduleAPIName = this.commonAPIHandler.getModuleAPIName(); let returnJSON = await this.isRecordRequest(requestInstance, classDetail, instanceNumber, memberDetail).catch((err) => { throw err; }); this.commonAPIHandler.setModuleAPIName(moduleAPIName); return returnJSON; } else { return await this.isNotRecordRequest(requestInstance, classDetail, instanceNumber, memberDetail).catch((err) => { throw err; }); } } async isNotRecordRequest(requestInstance, classDetail, instanceNumber, classMemberDetail) { let lookUp = false; let skipMandatory = false; let classMemberName = null; if (classMemberDetail !== null) { lookUp = (classMemberDetail.hasOwnProperty(constants_1.Constants.LOOKUP) ? classMemberDetail[constants_1.Constants.LOOKUP] : false); skipMandatory = (classMemberDetail.hasOwnProperty(constants_1.Constants.SKIP_MANDATORY) ? classMemberDetail[constants_1.Constants.SKIP_MANDATORY] : false); classMemberName = await this.buildName(classMemberDetail[constants_1.Constants.NAME]).catch((err) => { throw err; }); } let requestJSON = {}; let requiredKeys = new Map(); let primaryKeys = new Map(); let requiredInUpdateKeys = new Map(); for (let memberName in classDetail) { let modification = null; let memberDetail = classDetail[memberName]; if ((memberDetail.hasOwnProperty(constants_1.Constants.READ_ONLY) && memberDetail[constants_1.Constants.READ_ONLY] == 'true') || !memberDetail.hasOwnProperty(constants_1.Constants.NAME)) { // read only or no keyName continue; } let keyName = memberDetail[constants_1.Constants.NAME]; try { modification = requestInstance.isKeyModified(keyName); } catch (e) { throw new sdk_exception_1.SDKException(constants_1.Constants.EXCEPTION_IS_KEY_MODIFIED, null, null, e); } if (memberDetail.hasOwnProperty(constants_1.Constants.REQUIRED) && memberDetail[constants_1.Constants.REQUIRED] == true) { requiredKeys.set(keyName, true); } if (memberDetail.hasOwnProperty(constants_1.Constants.PRIMARY) && memberDetail[constants_1.Constants.PRIMARY] == true && (!memberDetail.hasOwnProperty(constants_1.Constants.REQUIRED_IN_UPDATE) || memberDetail[constants_1.Constants.REQUIRED_IN_UPDATE] == true)) { primaryKeys.set(keyName, true); } if (memberDetail.hasOwnProperty(constants_1.Constants.REQUIRED_IN_UPDATE) && memberDetail[constants_1.Constants.REQUIRED_IN_UPDATE] == true) { requiredInUpdateKeys.set(keyName, true); } let fieldValue = null; if (modification != null && modification !== undefined && modification != 0) { fieldValue = Reflect.get(requestInstance, memberName); if (fieldValue != null) { if (await this.valueChecker(requestInstance.constructor.name, memberName, memberDetail, fieldValue, this.uniqueValuesMap, instanceNumber).catch((err) => { throw err; })) { requiredKeys.delete(keyName); primaryKeys.delete(keyName); requiredInUpdateKeys.delete(keyName); } } requestJSON[keyName] = await this.setData(memberDetail, fieldValue).catch((err) => { throw err; }); } } if (skipMandatory || this.checkException(classMemberName, requestInstance, instanceNumber, lookUp, requiredKeys, primaryKeys, requiredInUpdateKeys)) { return requestJSON; } return requestJSON; } checkException(memberName, requestInstance, instanceNumber, lookUp, requiredKeys, primaryKeys, requiredInUpdateKeys) { if (requiredInUpdateKeys.size > 0 && this.commonAPIHandler.getCategoryMethod() != null && this.commonAPIHandler.getCategoryMethod().toUpperCase() == constants_1.Constants.REQUEST_CATEGORY_UPDATE) { let error = {}; error.field = memberName; error.type = requestInstance.constructor.name; error.keys = Array.from(requiredInUpdateKeys.keys()).toString(); if (instanceNumber != null) { error.instance_number = instanceNumber; } throw new sdk_exception_1.SDKException(constants_1.Constants.MANDATORY_VALUE_ERROR, constants_1.Constants.MANDATORY_KEY_ERROR, error); } if (this.commonAPIHandler.isMandatoryChecker() != null && this.commonAPIHandler.isMandatoryChecker()) { if (this.commonAPIHandler.getCategoryMethod().toUpperCase() == constants_1.Constants.REQUEST_CATEGORY_CREATE) { if (lookUp) { if (primaryKeys.size > 0) { let error = {}; error.field = memberName; error.type = requestInstance.constructor.name; error.keys = Array.from(primaryKeys.keys()).toString(); if (instanceNumber != null) { error.instance_number = instanceNumber; } throw new sdk_exception_1.SDKException(constants_1.Constants.MANDATORY_VALUE_ERROR, constants_1.Constants.PRIMARY_KEY_ERROR, error); } } else if (requiredKeys.size > 0) { let error = {}; error.field = memberName; error.type = requestInstance.constructor.name; error.keys = Array.from(requiredKeys.keys()).toString(); if (instanceNumber != null) { error.instance_number = instanceNumber; } throw new sdk_exception_1.SDKException(constants_1.Constants.MANDATORY_VALUE_ERROR, constants_1.Constants.MANDATORY_KEY_ERROR, error); } } if (this.commonAPIHandler.getCategoryMethod().toUpperCase() == constants_1.Constants.REQUEST_CATEGORY_UPDATE && primaryKeys.size > 0) { let error = {}; error.field = memberName; error.type = requestInstance.constructor.name; error.keys = Array.from(primaryKeys.keys()).toString(); if (instanceNumber != null) { error.instance_number = instanceNumber; } throw new sdk_exception_1.SDKException(constants_1.Constants.MANDATORY_VALUE_ERROR, constants_1.Constants.PRIMARY_KEY_ERROR, error); } } else if (lookUp && this.commonAPIHandler.getCategoryMethod().toUpperCase() == constants_1.Constants.REQUEST_CATEGORY_UPDATE) { if (primaryKeys.size > 0) { let error = {}; error.field = memberName; error.type = requestInstance.constructor.name; error.keys = Array.from(primaryKeys.keys()).toString(); if (instanceNumber != null) { error.instance_number = instanceNumber; } throw new sdk_exception_1.SDKException(constants_1.Constants.MANDATORY_VALUE_ERROR, constants_1.Constants.PRIMARY_KEY_ERROR, error); } } return true; } // isRecordRequest async isRecordRequest(recordInstance, classDetail, instanceNumber, memberDetail) { var lookUp = false; var skipMandatory = false; var classMemberName = null; if (memberDetail != null) { lookUp = (memberDetail.hasOwnProperty(constants_1.Constants.LOOKUP) ? memberDetail[constants_1.Constants.LOOKUP] : false); skipMandatory = (memberDetail.hasOwnProperty(constants_1.Constants.SKIP_MANDATORY) ? memberDetail[constants_1.Constants.SKIP_MANDATORY] : false); classMemberName = await this.buildName(memberDetail[constants_1.Constants.NAME]).catch((err) => { throw err; }); } var requestJSON = {}; var moduleDetail = {}; let moduleAPIName = this.commonAPIHandler.getModuleAPIName(); if (moduleAPIName !== null) { // entry this.commonAPIHandler.setModuleAPIName(null); moduleDetail = await this.getModuleDetailFromUserSpecJSON(moduleAPIName).catch((err) => { throw err; }); } else { // inner case moduleDetail = classDetail; classDetail = initializer_1.Initializer.jsonDetails[constants_1.Constants.RECORD_NAMESPACE]; } // class detail must contain record structure at this point let keyValues = new Map(); let uniqueValues = new Map(); keyValues = Reflect.get(recordInstance, constants_1.Constants.KEY_VALUES); let keyModified = new Map(); keyModified = Reflect.get(recordInstance, constants_1.Constants.KEY_MODIFIED); let requiredKeys = new Map(); let primaryKeys = new Map(); if (!skipMandatory) { for (let keyName of Object.keys(moduleDetail)) { const keyDetail = moduleDetail[keyName]; let name = keyDetail[constants_1.Constants.NAME]; if (keyDetail.hasOwnProperty(constants_1.Constants.REQUIRED) && keyDetail[constants_1.Constants.REQUIRED] == true) { requiredKeys.set(name, true); } if (keyDetail.hasOwnProperty(constants_1.Constants.PRIMARY) && keyDetail[constants_1.Constants.PRIMARY] == true) { primaryKeys.set(name, true); } } for (let keyName of Object.keys(classDetail)) { const keyDetail = classDetail[keyName]; let name = keyDetail[constants_1.Constants.NAME]; if (keyDetail.hasOwnProperty(constants_1.Constants.REQUIRED) && keyDetail[constants_1.Constants.REQUIRED] == true) { requiredKeys.set(name, true); } if (keyDetail.hasOwnProperty(constants_1.Constants.PRIMARY) && keyDetail[constants_1.Constants.PRIMARY] == true) { primaryKeys.set(name, true); } } } for (let keyName of Array.from(keyModified.keys())) { if (keyModified.get(keyName) != 1) { continue; } let keyDetail = {}; let keyValue = keyValues.has(keyName) ? keyValues.get(keyName) : null; let jsonValue = null; if (keyValue != null) { requiredKeys.delete(keyName); primaryKeys.delete(keyName); } let memberName = await this.buildName(keyName).catch((err) => { throw err; }); var customHandling = false; if (moduleDetail != null && Object.keys(moduleDetail).length > 0 && (moduleDetail.hasOwnProperty(keyName) || moduleDetail.hasOwnProperty(memberName))) { if (moduleDetail.hasOwnProperty(keyName)) { keyDetail = moduleDetail[keyName]; // incase of user spec json } else { keyDetail = moduleDetail[memberName]; // json details } } else if (classDetail.hasOwnProperty(memberName)) { keyDetail = classDetail[memberName]; } else { customHandling = true; } if (keyValue != null) { if (Object.keys(keyDetail).length > 0) { if ((keyDetail.hasOwnProperty(constants_1.Constants.READ_ONLY) && (keyDetail[constants_1.Constants.READ_ONLY] == true || keyDetail[constants_1.Constants.READ_ONLY] == 'true')) || !keyDetail.hasOwnProperty(constants_1.Constants.NAME)) { // read only or no keyName continue; } if (await this.valueChecker(recordInstance.constructor.name, memberName, keyDetail, keyValue, uniqueValues, instanceNumber).catch((err) => { throw err; })) { jsonValue = await this.setData(keyDetail, keyValue).catch((err) => { throw err; }); } } else { if (customHandling && !(Array.isArray(keyValue)) && !(keyValue instanceof Map) && !(keyValue instanceof choice_1.Choice)) { let key = await this.keyINJSONDetails(keyValue.constructor.name).catch((err) => { throw err; }); if (keyValue instanceof Date) { if (keyValue.getHours() == 0 && keyValue.getMinutes() == 0 && keyValue.getSeconds() == 0) { jsonValue = await datatype_converter_1.DatatypeConverter.postConvert(keyValue, "date"); } else { jsonValue = await datatype_converter_1.DatatypeConverter.postConvert(keyValue, "datetime"); } } if (constants_1.Constants.PRIMITIVE_TYPES.includes(typeof keyValue)) { keyDetail[constants_1.Constants.TYPE] = typeof keyValue; jsonValue = await this.setData(keyDetail, keyValue).catch((err) => { throw err; }); } else if (key != null) { keyDetail[constants_1.Constants.STRUCTURE_NAME] = key; keyDetail[constants_1.Constants.NAME] = keyName; keyDetail[constants_1.Constants.TYPE] = key; jsonValue = await this.setData(keyDetail, keyValue).catch((err) => { throw err; }); } } else { if (customHandling && keyValue.constructor.name == constants_1.Constants.ARRAY_KEY && keyValue.length > 0) { let key1 = await this.keyINJSONDetails(keyValue[0].constructor.name).catch((err) => { throw err; }); if (key1 != null) { keyDetail[constants_1.Constants.STRUCTURE_NAME] = key1; keyDetail[constants_1.Constants.NAME] = keyName; keyDetail[constants_1.Constants.TYPE] = key1; jsonValue = await this.setJSONArray(keyValue, keyDetail); } else { jsonValue = await this.redirectorForObjectToJSON(keyValue).catch((err) => { throw err; }); } } else { jsonValue = await this.redirectorForObjectToJSON(keyValue).catch((err) => { throw err; }); } } } } else { jsonValue = null; } requestJSON[keyName] = jsonValue; } if (skipMandatory || this.checkException(classMemberName, recordInstance, instanceNumber, lookUp, requiredKeys, primaryKeys, new Map())) { return requestJSON; } return requestJSON; } async keyINJSONDetails(className) { let jsondetails = initializer_1.Initializer.jsonDetails; for (var key in jsondetails) { let arr = key.split("/"); let fileName = arr[arr.length - 1]; fileName = fileName.split("_").join(""); if (fileName.toLowerCase() == className.toLowerCase()) { return key; } } return null; } async setData(memberDetail, fieldValue) { if (fieldValue != null) { let type = memberDetail[constants_1.Constants.TYPE].toString(); return await this.setDataValue(type, memberDetail, fieldValue).catch((err) => { throw err; }); } return null; } async setDataValue(type, memberDetail, fieldValue) { if (type.toLowerCase() == constants_1.Constants.LIST_NAMESPACE.toLowerCase()) { return await this.setJSONArray(fieldValue, memberDetail).catch((err) => { throw err; }); } else if (type.toLowerCase() == constants_1.Constants.MAP_NAMESPACE.toLowerCase()) { return await this.setJSONObject(fieldValue, memberDetail).catch((err) => { throw err; }); } else if (type == constants_1.Constants.CHOICE_NAMESPACE || (memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME) && memberDetail[constants_1.Constants.STRUCTURE_NAME] == constants_1.Constants.CHOICE_NAMESPACE)) { return (fieldValue.getValue()); } else if (memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME) && memberDetail.hasOwnProperty(constants_1.Constants.MODULE)) { return await this.isRecordRequest(fieldValue, await this.getModuleDetailFromUserSpecJSON(memberDetail[constants_1.Constants.MODULE]).catch((err) => { throw err; }), null, memberDetail).catch((err) => { throw err; }); } else if (memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME)) { return await this.formRequest(fieldValue, memberDetail[constants_1.Constants.STRUCTURE_NAME], null, memberDetail).catch((err) => { throw err; }); } else { return await datatype_converter_1.DatatypeConverter.postConvert(fieldValue, type.toLowerCase()); } } async setJSONObject(fieldValue, memberDetail) { let jsonObject = {}; let requestObject = fieldValue; if (Array.from(requestObject.keys()).length > 0) { if (memberDetail == null || (memberDetail != null && !memberDetail.hasOwnProperty(constants_1.Constants.KEYS))) { for (let key of Array.from(requestObject.keys())) { jsonObject[key] = await this.redirectorForObjectToJSON(requestObject.get(key)).catch((err) => { throw err; }); } } else { if (memberDetail !== null && memberDetail.hasOwnProperty(constants_1.Constants.KEYS)) { var keysDetail = memberDetail[constants_1.Constants.KEYS]; for (let keyIndex = 0; keyIndex < keysDetail.length; keyIndex++) { let keyDetail = keysDetail[keyIndex]; let keyName = keyDetail[constants_1.Constants.NAME]; let keyValue = null; if (requestObject.has(keyName) && requestObject.get(keyName) != null) { keyValue = await this.setData(keyDetail, requestObject.get(keyName)).catch((err) => { throw err; }); jsonObject[keyName] = keyValue; } } } } } return jsonObject; } async setJSONArray(fieldValue, memberDetail) { let jsonArray = []; let requestObjects = fieldValue; if (requestObjects.length > 0) { if (memberDetail == null || (memberDetail != null && !memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME))) { if (memberDetail != null && memberDetail.hasOwnProperty(constants_1.Constants.SUB_TYPE)) { let subType = memberDetail[constants_1.Constants.SUB_TYPE]; let type = subType[constants_1.Constants.TYPE]; if (type == constants_1.Constants.CHOICE_NAMESPACE) { for (let request of requestObjects) { jsonArray.push((request.getValue())); } } else { for (let request of requestObjects) { jsonArray.push(await this.setDataValue(type, memberDetail, request)); } } } else { for (let request of requestObjects) { jsonArray.push(await this.redirectorForObjectToJSON(request).catch((err) => { throw err; })); } } } else { let pack = memberDetail[constants_1.Constants.STRUCTURE_NAME].toString(); if (pack == constants_1.Constants.CHOICE_NAMESPACE) { for (let request of requestObjects) { jsonArray.push((request.getValue())); } } else if (memberDetail.hasOwnProperty(constants_1.Constants.MODULE) && memberDetail[constants_1.Constants.MODULE] != null) { let instanceCount = 0; for (let request of requestObjects) { jsonArray.push(await this.isRecordRequest(request, await this.getModuleDetailFromUserSpecJSON(memberDetail[constants_1.Constants.MODULE]).catch((err) => { throw err; }), instanceCount++, memberDetail)); } } else { let instanceCount = 0; for (let request of requestObjects) { jsonArray.push(await this.formRequest(request, pack, instanceCount++, memberDetail)); } } } } return jsonArray; } async redirectorForObjectToJSON(request) { if (Array.isArray(request)) { return await this.setJSONArray(request, null).catch((err) => { throw err; }); } else if (request instanceof Map) { return await this.setJSONObject(request, null).catch((err) => { throw err; }); } else if (request instanceof choice_1.Choice) { return request.getValue(); } else { return request; } } async getFileName(name) { let fileName = []; let nameParts = name.split(/([A-Z][a-z]+)/).filter(function (e) { return e; }); fileName.push(nameParts[0].toLowerCase()); for (let i = 1; i < nameParts.length; i++) { fileName.push(nameParts[i].toLowerCase()); } return fileName.join("_"); } async getWrappedResponse(response, pack) { if (response.body.length != 0) { var responseJson = JSON.parse(response.body); return await this.getResponse(responseJson, pack).catch((err) => { throw err; }); } return null; } async getResponse(responseJson, packageName) { var instance = null; if (responseJson == null || responseJson == "" || responseJson.length == 0) { return instance; } var classDetail = initializer_1.Initializer.jsonDetails[packageName]; var instance = null; if (classDetail.hasOwnProperty(constants_1.Constants.INTERFACE) && classDetail[constants_1.Constants.INTERFACE]) { let classes = classDetail[constants_1.Constants.CLASSES]; instance = await this.findMatch(classes, responseJson).catch((err) => { throw err; }); // findmatch returns instance(calls getresponse() recursively) } else { let ClassName = (await Promise.resolve(`${"../../".concat(packageName)}`).then(s => __importStar(require(s)))).MasterModel; instance = new ClassName(); if (instance instanceof record_1.Record) { // if record -> based on response json data will be assigned to field Values let moduleAPIName = this.commonAPIHandler.getModuleAPIName(); instance = await this.isRecordResponse(responseJson, classDetail, packageName).catch((err) => { throw err; }); this.commonAPIHandler.setModuleAPIName(moduleAPIName); } else { instance = await this.notRecordResponse(instance, responseJson, classDetail).catch((err) => { throw err; }); } } return instance; } async moduleToClass(moduleName) { let className = moduleName; if (moduleName.includes("_")) { className = ''; let moduleSplit = moduleName.split("_"); for (let eachName in moduleSplit) { eachName = eachName.charAt(0).toUpperCase() + eachName.slice(1); className = className + eachName; } } else { className = moduleName.charAt(0).toUpperCase() + className.slice(1); } return className; } async notRecordResponse(instance, responseJSON, classDetail) { for (let memberName in classDetail) { let keyDetail = classDetail[memberName]; let keyName = keyDetail.hasOwnProperty(constants_1.Constants.NAME) ? keyDetail[constants_1.Constants.NAME] : null; // api-name of the member if (keyName != null && responseJSON.hasOwnProperty(keyName) && responseJSON[keyName] !== null) { let keyData = responseJSON[keyName]; let memberValue = await this.getData(keyData, keyDetail).catch((err) => { throw err; }); Reflect.set(instance, memberName, memberValue); } } return instance; } async isRecordResponse(responseJson, classDetail, pack) { let className = (await Promise.resolve(`${"../../" + pack}`).then(s => __importStar(require(s)))).MasterModel; let recordInstance = new className(); let moduleAPIName = this.commonAPIHandler.getModuleAPIName(); let moduleDetail = {}; if (moduleAPIName != null) { // entry this.commonAPIHandler.setModuleAPIName(null); moduleDetail = await this.getModuleDetailFromUserSpecJSON(moduleAPIName).catch((err) => { throw err; }); } for (let key in classDetail) { if (moduleDetail == null) { moduleDetail = {}; } moduleDetail[key] = classDetail[key]; } var recordDetail = initializer_1.Initializer.jsonDetails[constants_1.Constants.RECORD_NAMESPACE]; var keyValues = new Map(); for (let keyName in responseJson) { let memberName = await this.buildName(keyName).catch((err) => { throw err; }); let keyDetail = {}; if (moduleDetail != null && Object.keys(moduleDetail).length > 0 && (moduleDetail.hasOwnProperty(keyName) || moduleDetail.hasOwnProperty(memberName))) { if (moduleDetail.hasOwnProperty(keyName)) { keyDetail = moduleDetail[keyName]; } else { keyDetail = moduleDetail[memberName]; } } else if (recordDetail.hasOwnProperty(memberName)) { keyDetail = recordDetail[memberName]; } let keyValue = null; let keyData = responseJson[keyName]; if (keyDetail != null && Object.keys(keyDetail).length > 0) { keyName = keyDetail[constants_1.Constants.NAME]; keyValue = await this.getData(keyData, keyDetail).catch((err) => { throw err; }); } else { // if not key detail keyValue = await this.redirectorForJSONToObject(keyData).catch((err) => { throw err; }); } keyValues.set(keyName, keyValue); } Reflect.set(recordInstance, constants_1.Constants.KEY_VALUES, keyValues); return recordInstance; } async getData(keyData, memberDetail) { let memberValue = null; if (keyData !== null) { let type = memberDetail[constants_1.Constants.TYPE].toString(); memberValue = await this.getDataValue(type, keyData, memberDetail).catch((err) => { throw err; }); } return memberValue; } async getDataValue(type, keyData, memberDetail) { let memberValue = null; if (type.toLowerCase() == constants_1.Constants.LIST_NAMESPACE.toLowerCase()) { memberValue = await this.getCollectionsData(keyData, memberDetail).catch((err) => { throw err; }); } else if (type.toLowerCase() == constants_1.Constants.MAP_NAMESPACE.toLowerCase()) { memberValue = await this.getMapData(keyData, memberDetail).catch((err) => { throw err; }); } else if (type == constants_1.Constants.CHOICE_NAMESPACE || (memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME) && memberDetail[constants_1.Constants.STRUCTURE_NAME] == constants_1.Constants.CHOICE_NAMESPACE)) { let Choice = (await Promise.resolve(`${constants_1.Constants.CHOICE_PATH}`).then(s => __importStar(require(s)))).MasterModel; memberValue = new Choice(keyData); } else if (memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME) && memberDetail.hasOwnProperty(constants_1.Constants.MODULE)) { memberValue = await this.isRecordResponse(keyData, await this.getModuleDetailFromUserSpecJSON(memberDetail[constants_1.Constants.MODULE]).catch((err) => { throw err; }), memberDetail[constants_1.Constants.STRUCTURE_NAME]).catch((err) => { throw err; }); } else if (memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME)) { memberValue = await this.getResponse(keyData, memberDetail[constants_1.Constants.STRUCTURE_NAME]).catch((err) => { throw err; }); } else { memberValue = await datatype_converter_1.DatatypeConverter.preConvert(keyData, type.toLowerCase()); } return memberValue; } async getMapData(response, memberDetail) { var mapInstance = new Map(); if (Object.keys(response).length > 0) { if (memberDetail == null || (memberDetail != null && !memberDetail.hasOwnProperty(constants_1.Constants.KEYS))) { for (let key in response) { mapInstance.set(key, await this.redirectorForJSONToObject(response[key]).catch((err) => { throw err; })); } } else { // member must have keys if (memberDetail.hasOwnProperty(constants_1.Constants.KEYS)) { var keysDetail = memberDetail[constants_1.Constants.KEYS]; for (let keyIndex = 0; keyIndex < keysDetail.length; keyIndex++) { var keyDetail = keysDetail[keyIndex]; var keyName = keyDetail[constants_1.Constants.NAME]; var keyValue = null; if (response.hasOwnProperty(keyName) && response[keyName] != null) { keyValue = await this.getData(response[keyName], keyDetail).catch((err) => { throw err; }); mapInstance.set(keyName, keyValue); } } } } } return mapInstance; } async getCollectionsData(responses, memberDetail) { var values = new Array(); if (responses.length > 0) { if (memberDetail == null || (memberDetail != null && !memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME))) { if (memberDetail != null && memberDetail.hasOwnProperty(constants_1.Constants.SUB_TYPE)) { let subType = memberDetail[constants_1.Constants.SUB_TYPE]; let type = subType[constants_1.Constants.TYPE]; if (type == constants_1.Constants.CHOICE_NAMESPACE) { for (let response of responses) { let choiceClass = (await Promise.resolve(`${constants_1.Constants.CHOICE_PATH + ".js"}`).then(s => __importStar(require(s)))).MasterModel; let choiceInstance = new choiceClass(response); values.push(choiceInstance); } } else { for (let response of responses) { values.push(await this.getDataValue(type, response, memberDetail).catch((err) => { throw err; })); } } } else { for (let response of responses) { values.push(await this.redirectorForJSONToObject(response).catch((err) => { throw err; })); } } } else { // need to have structure Name in memberDetail var pack = memberDetail[constants_1.Constants.STRUCTURE_NAME]; if (pack == constants_1.Constants.CHOICE_NAMESPACE) { for (let response of responses) { let choiceClass = (await Promise.resolve(`${constants_1.Constants.CHOICE_PATH}`).then(s => __importStar(require(s)))).MasterModel; let choiceInstance = new choiceClass(response); values.push(choiceInstance); } } else if (memberDetail.hasOwnProperty(constants_1.Constants.MODULE) && memberDetail[constants_1.Constants.MODULE] != null) { for (let response of responses) { values.push(await this.isRecordResponse(response, await this.getModuleDetailFromUserSpecJSON(memberDetail[constants_1.Constants.MODULE]).catch((err) => { throw err; }), pack).catch((err) => { throw err; })); } } else { for (let response of responses) { values.push(await this.getResponse(response, pack).catch((err) => { throw err; })); } } } } return values; } async getModuleDetailFromUserSpecJSON(module) { var recordFieldDetailsPath = (0, path_1.join)(await converter_1.Converter.getEncodedFileName().catch((err) => { throw err; })); var moduleDetailFromUserSpecJSON = initializer_1.Initializer.getJSON(recordFieldDetailsPath); var moduleDetail = await utility_1.Utility.getJSONObject(moduleDetailFromUserSpecJSON, module).catch((err) => { throw err; }); if (moduleDetail != null && Object.keys(moduleDetail).length == 0) { try { delete moduleDetailFromUserSpecJSON[module.toLowerCase()]; (0, fs_1.writeFileSync)(recordFieldDetailsPath, JSON.stringify(moduleDetailFromUserSpecJSON)); } catch (e) { throw e; } } return moduleDetail; } async redirectorForJSONToObject(keyData) { let type = Object.prototype.toString.call(keyData); if (type == constants_1.Constants.OBJECT_TYPE) { return await this.getMapData(keyData, null).catch((err) => { throw err; }); } else if (type == constants_1.Constants.ARRAY_TYPE) { return await this.getCollectionsData(keyData, null).catch((err) => { throw err; }); } else { return keyData; } } async findMatch(classes, responseJson) { let pack = ""; let ratio = 0; for (let className of classes) { var matchRatio = await this.findRatio(className, responseJson).catch((err) => { throw err; }); if (matchRatio == 1.0) { pack = className; ratio = 1; break; } else if (matchRatio > ratio) { ratio = matchRatio; pack = className; } } return this.getResponse(responseJson, pack).catch((err) => { throw err; }); } findRatio(className, responseJson) { var classDetail = initializer_1.Initializer.jsonDetails[className]; var totalPoints = Array.from(Object.keys(classDetail)).length; var matches = 0; if (totalPoints == 0) { return Promise.resolve(0); } else { for (let memberName in classDetail) { var memberDetail = classDetail[memberName]; var keyName = memberDetail.hasOwnProperty(constants_1.Constants.NAME) ? memberDetail[constants_1.Constants.NAME] : null; if (keyName != null && responseJson.hasOwnProperty(keyName) && responseJson[keyName] != null) { // key not empty var keyData = responseJson[keyName]; let type = Object.prototype.toString.call(keyData); let structureName = memberDetail.hasOwnProperty(constants_1.Constants.STRUCTURE_NAME) ? memberDetail[constants_1.Constants.STRUCTURE_NAME] : null; if (type == constants_1.Constants.OBJECT_TYPE) { type = constants_1.Constants.MAP_TYPE; } if (constants_1.Constants.TYPE_VS_DATATYPE.has(memberDetail[constants_1.Constants.TYPE].toLowerCase()) && constants_1.Constants.TYPE_VS_DATATYPE.get(memberDetail[constants_1.Constants.TYPE].toLowerCase()) == type) { matches++; } else if (keyName.toLowerCase() == constants_1.Constants.COUNT && memberDetail[constants_1.Constants.TYPE].toLowerCase() == constants_1.Constants.LONG_NAMESPACE.toLowerCase() && type == constants_1.Constants.NUMBER_TYPE) { matches++; } else if (memberDetail[constants_1.Constants.TYPE] == constants_1.Constants.CHOICE_NAMESPACE) { let values = memberDetail[constants_1.Constants.VALUES]; for (let value in values) { if (keyData == values[value]) { matches++; break; } } } if (structureName != null && structureName == memberDetail[constants_1.Constants.TYPE]) { if (memberDetail.hasOwnProperty(constants_1.Constants.VALUES)) { let values = memberDetail[constants_1.Constants.VALUES]; for (let value in values) { if (keyData == values[value]) { matches++; break; } } } else { matches++; } } } } } return Promise.resolve(matches / totalPoints); } async buildName(memberName) { let name = memberName.split("_"); var index = 0; if (name.length == 0) { index = 1; } var sdkName = name[0]; if (sdkName.length != 0 && name[0].length != 0) { sdkName = sdkName[0].toLowerCase() + sdkName.slice(1); } index = 1; for (var nameIndex = index; nameIndex < name.length; nameIndex++) { var fieldName = name[nameIndex]; var firstLetterUppercase = ""; if (fieldName.length > 0) { firstLetterUppercase = fieldName[0].toUpperCase() + fieldName.slice(1); } sdkName = sdkName.concat(firstLetterUppercase); } return sdkName; } } exports.JSONConverter = JSONConverter;