UNPKG

@zohocrm/typescript-sdk-6.0

Version:
973 lines • 62.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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MasterModel = exports.Utility = void 0;
const path = __importStar(require("path"));
const converter_js_1 = require("./converter.js");
const initializer_js_1 = require("../../routes/initializer.js");
const constants_js_1 = require("./constants.js");
const minified_module_js_1 = require("../../core/com/zoho/crm/api/modules/minified_module.js");
const winston_1 = __importDefault(require("winston"));
const fs = __importStar(require("fs"));
const sdk_exception_js_1 = require("../../core/com/zoho/crm/api/exception/sdk_exception.js");
const zohocrmsdk_js_1 = require("../../zohocrmsdk.js");
const choice_js_1 = require("./choice.js");
/**
 * This class handles module field details.
 */
class Utility {
    static async assertNotNull(value, errorCode, errorMessage) {
        if (value == null) {
            throw new sdk_exception_js_1.SDKException(errorCode, errorMessage);
        }
    }
    static async fileExistsFlow(moduleAPIName, recordFieldDetailsPath, lastModifiedTime) {
        let recordFieldDetailsJson = initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
        let initializer = await initializer_js_1.Initializer.getInitializer().catch((err) => { throw err; });
        if (initializer == null || initializer == undefined) {
            throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.SDK_UNINITIALIZATION_ERROR, constants_js_1.Constants.SDK_UNINITIALIZATION_MESSAGE);
        }
        if (initializer.getSDKConfig() != null && initializer.getSDKConfig().getAutoRefreshFields() == true && !this.newFile && !this.getModifiedModules && (!recordFieldDetailsJson.hasOwnProperty(constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME) || this.forceRefresh || new Date().getTime() - recordFieldDetailsJson[constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME] > 3600000)) {
            this.getModifiedModules = true;
            lastModifiedTime = !this.forceRefresh && recordFieldDetailsJson.hasOwnProperty(constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME) ? recordFieldDetailsJson[constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME] : null;
            await Utility.modifyFields(recordFieldDetailsPath, lastModifiedTime).catch((err) => { throw err; });
            this.getModifiedModules = false;
        }
        else if (initializer.getSDKConfig() != null && initializer.getSDKConfig().getAutoRefreshFields() == false && this.forceRefresh && !this.getModifiedModules) {
            this.getModifiedModules = true;
            await Utility.modifyFields(recordFieldDetailsPath, lastModifiedTime).catch((err) => { throw err; });
            this.getModifiedModules = false;
        }
        recordFieldDetailsJson = initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
        if (moduleAPIName == null || (recordFieldDetailsJson.hasOwnProperty(moduleAPIName.toLowerCase()) && recordFieldDetailsJson[moduleAPIName.toLowerCase()] != null)) {
            return;
        }
        else {
            await Utility.fillDataType().catch((err) => { throw err; });
            recordFieldDetailsJson[moduleAPIName.toLowerCase()] = {};
            fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
            let fieldsDetails = await Utility.getFieldsDetails(moduleAPIName).catch(err => { throw err; });
            recordFieldDetailsJson = await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
            recordFieldDetailsJson[moduleAPIName.toLowerCase()] = fieldsDetails;
            fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
        }
    }
    static async verifyModuleAPIName(moduleName) {
        if (moduleName != null && constants_js_1.Constants.DEFAULT_MODULENAME_VS_APINAME.has(moduleName.toLowerCase()) && constants_js_1.Constants.DEFAULT_MODULENAME_VS_APINAME.get(moduleName.toLowerCase()) != null) {
            return constants_js_1.Constants.DEFAULT_MODULENAME_VS_APINAME.get(moduleName.toLowerCase());
        }
        var recordFieldDetailsPath = await this.getFileName().catch((err) => { throw err; });
        if (fs.existsSync(recordFieldDetailsPath)) {
            let fieldsJSON = initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
            if (fieldsJSON.hasOwnProperty(constants_js_1.Constants.SDK_MODULE_METADATA) && fieldsJSON[constants_js_1.Constants.SDK_MODULE_METADATA].hasOwnProperty(moduleName.toLowerCase())) {
                let moduleMeta = fieldsJSON[constants_js_1.Constants.SDK_MODULE_METADATA];
                return moduleMeta[moduleName.toLowerCase()][constants_js_1.Constants.API_NAME];
            }
        }
        return moduleName;
    }
    static async setHandlerAPIPath(moduleAPIName, handlerInstance) {
        if (handlerInstance == null) {
            return;
        }
        let apiPath = handlerInstance.getAPIPath();
        if (moduleAPIName != null && apiPath.toLowerCase().includes(moduleAPIName.toLowerCase())) {
            let apiPathSplit = apiPath.split("/");
            for (var i = 0; i < apiPathSplit.length; i++) {
                if (apiPathSplit[i] != null && apiPathSplit[i].toLowerCase() == moduleAPIName.toLowerCase()) {
                    apiPathSplit[i] = moduleAPIName;
                }
                else if (apiPathSplit[i] != null && constants_js_1.Constants.DEFAULT_MODULENAME_VS_APINAME.has(apiPathSplit[i].toLowerCase()) && constants_js_1.Constants.DEFAULT_MODULENAME_VS_APINAME.get(apiPathSplit[i].toLowerCase()) != null) {
                    apiPathSplit[i] = constants_js_1.Constants.DEFAULT_MODULENAME_VS_APINAME.get(apiPathSplit[i].toLowerCase());
                }
            }
            apiPath = apiPathSplit.join("/");
            handlerInstance.setAPIPath(apiPath);
        }
    }
    /**
     * This method to fetch field details of the current module for the current user and store the result in a JSON file.
     * @param {string} moduleAPIName - A String containing the CRM module API name.
     * @param {string} handlerInstance - A String containing CommonAPIHandler Instance.
     */
    static async getFields(moduleAPIName, handlerInstance = null) {
        if (this.moduleAPIName != null && this.moduleAPIName.includes(",")) {
            let moduleAPINames = this.moduleAPIName.split(",");
            for (var i = 0; i < moduleAPINames.length; i++) {
                this.moduleAPIName = moduleAPINames[i];
                await this.getFieldsInfo(this.moduleAPIName, handlerInstance).catch((err) => { throw err; });
            }
        }
        else {
            this.moduleAPIName = moduleAPIName;
            await this.getFieldsInfo(this.moduleAPIName, handlerInstance).catch((err) => { throw err; });
        }
    }
    /**
     * This method to fetch field details of the current module for the current user and store the result in a JSON file.
     * @param {string} moduleAPIName - A String containing the CRM module API name.
     * @param {string} handlerInstance - A String containing CommonAPIHandler Instance.
     */
    static async getFieldsInfo(moduleAPIName, handlerInstance = null) {
        let lastModifiedTime = null;
        var recordFieldDetailsPath = null;
        try {
            let initializer = await initializer_js_1.Initializer.getInitializer().catch((err) => { throw err; });
            if (initializer == null || initializer == undefined) {
                throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.SDK_UNINITIALIZATION_ERROR, constants_js_1.Constants.SDK_UNINITIALIZATION_MESSAGE);
            }
            var resourcesPath = path.join(initializer.getResourcePath(), constants_js_1.Constants.FIELD_DETAILS_DIRECTORY);
            if (!fs.existsSync(resourcesPath)) {
                fs.mkdirSync(resourcesPath, { recursive: true });
            }
            if (moduleAPIName != null) {
                moduleAPIName = await Utility.verifyModuleAPIName(moduleAPIName).catch((err) => { throw err; });
                await Utility.setHandlerAPIPath(moduleAPIName, handlerInstance).catch((err) => { throw err; });
                if (handlerInstance != null && handlerInstance.getModuleAPIName() == null && (moduleAPIName != null && !constants_js_1.Constants.SKIP_MODULES.includes(moduleAPIName.toLowerCase()))) {
                    return;
                }
            }
            recordFieldDetailsPath = resourcesPath + "/" + await this.getFileName().catch((err) => { throw err; });
            if (fs.existsSync(recordFieldDetailsPath)) {
                await Utility.fileExistsFlow(moduleAPIName, recordFieldDetailsPath, lastModifiedTime).catch((err) => { throw err; });
            }
            else if (initializer.getSDKConfig() !== null && initializer.getSDKConfig().getAutoRefreshFields() == true) {
                this.newFile = true;
                await Utility.fillDataType().catch((err) => { throw err; });
                this.apiSupportedModule = Object.keys(this.apiSupportedModule).length > 0 ? this.apiSupportedModule : await Utility.getModules(null).catch((err) => { throw err; });
                let recordFieldDetailsJson = fs.existsSync(recordFieldDetailsPath) ? initializer_js_1.Initializer.getJSON(recordFieldDetailsPath) : {};
                recordFieldDetailsJson[constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME] = new Date().getTime();
                if (Object.keys(this.apiSupportedModule).length > 0) {
                    for (let module in this.apiSupportedModule) {
                        if (!recordFieldDetailsJson.hasOwnProperty(module)) {
                            let moduleData = this.apiSupportedModule[module];
                            recordFieldDetailsJson[module] = {};
                            fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
                            let fieldsDetails = await Utility.getFieldsDetails(moduleData[constants_js_1.Constants.API_NAME]).catch(err => { throw err; });
                            recordFieldDetailsJson = await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
                            recordFieldDetailsJson[module] = fieldsDetails;
                            fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
                        }
                    }
                }
                this.newFile = false;
            }
            else if (this.forceRefresh && !this.getModifiedModules) {
                //New file - and force refresh by Users
                this.getModifiedModules = true;
                let recordFieldDetailsJson = {};
                fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
                await Utility.modifyFields(recordFieldDetailsPath, lastModifiedTime).catch((err) => { throw err; });
                this.getModifiedModules = false;
            }
            else {
                await Utility.fillDataType().catch((err) => { throw err; });
                let recordFieldDetailsJson = {};
                if (moduleAPIName != null) {
                    recordFieldDetailsJson[moduleAPIName.toLowerCase()] = {};
                    fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
                    let fieldsDetails = await Utility.getFieldsDetails(moduleAPIName).catch(err => { throw err; });
                    recordFieldDetailsJson = await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
                    recordFieldDetailsJson[moduleAPIName.toLowerCase()] = fieldsDetails;
                    fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
                }
            }
        }
        catch (error) {
            if (recordFieldDetailsPath != null && fs.existsSync(recordFieldDetailsPath)) {
                try {
                    let recordFieldDetailsJson = await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
                    if (moduleAPIName != null) {
                        if (recordFieldDetailsJson.hasOwnProperty(moduleAPIName.toLowerCase())) {
                            delete recordFieldDetailsJson[moduleAPIName.toLowerCase()];
                        }
                    }
                    if (this.newFile) {
                        if (recordFieldDetailsJson.hasOwnProperty(constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME)) {
                            delete recordFieldDetailsJson[constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME];
                        }
                        this.newFile = false;
                    }
                    if (this.getModifiedModules || this.forceRefresh) {
                        this.getModifiedModules = false;
                        this.forceRefresh = false;
                        if (lastModifiedTime != null) {
                            recordFieldDetailsJson[constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME] = lastModifiedTime;
                        }
                    }
                    fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
                }
                catch (error) {
                    error = new sdk_exception_js_1.SDKException(null, null, null, error);
                    winston_1.default.error(constants_js_1.Constants.EXCEPTION, error);
                    throw error;
                }
            }
            if (!(error instanceof sdk_exception_js_1.SDKException)) {
                error = new sdk_exception_js_1.SDKException(null, null, null, error);
            }
            winston_1.default.error(constants_js_1.Constants.EXCEPTION, error);
            throw error;
        }
    }
    static async modifyFields(recordFieldDetailsPath, modifiedTime) {
        let modifiedModules = await this.getModules(modifiedTime).catch((err) => { throw err; });
        let recordFieldDetailsJson = await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
        recordFieldDetailsJson[constants_js_1.Constants.FIELDS_LAST_MODIFIED_TIME] = new Date().getTime();
        fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
        if (Object.keys(modifiedModules).length > 0) {
            for (let module in modifiedModules) {
                if (recordFieldDetailsJson.hasOwnProperty(module)) {
                    delete recordFieldDetailsJson[module];
                }
            }
            fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJson));
            for (let module in modifiedModules) {
                let moduleData = modifiedModules[module];
                await Utility.getFieldsInfo(moduleData[constants_js_1.Constants.API_NAME], null).catch((err) => { throw err; });
            }
        }
    }
    static async deleteFields(recordFieldDetailsJson, module) {
        let subformModules = [];
        let fieldsJSON = recordFieldDetailsJson[module.toLowerCase()];
        for (let keyName of Object.keys(fieldsJSON)) {
            if (fieldsJSON[keyName].hasOwnProperty(constants_js_1.Constants.SUBFORM) && fieldsJSON[keyName][constants_js_1.Constants.SUBFORM] == true && recordFieldDetailsJson.hasOwnProperty(fieldsJSON[keyName][constants_js_1.Constants.MODULE].toLowerCase())) {
                let subformModuleName = fieldsJSON[keyName][constants_js_1.Constants.MODULE];
                if (!subformModules.includes(subformModuleName)) {
                    subformModules.push(subformModuleName);
                }
            }
        }
        delete recordFieldDetailsJson[module.toLowerCase()];
        if (subformModules.length > 0) {
            for (let subformModule of subformModules) {
                await this.deleteFields(recordFieldDetailsJson, subformModule).catch((err) => { throw err; });
            }
        }
    }
    static async getFileName() {
        let initializer = await initializer_js_1.Initializer.getInitializer().catch((err) => { throw err; });
        if (initializer == null || initializer == undefined) {
            throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.SDK_UNINITIALIZATION_ERROR, constants_js_1.Constants.SDK_UNINITIALIZATION_MESSAGE);
        }
        let token = initializer.getToken();
        let tokenKey = "";
        if (token instanceof zohocrmsdk_js_1.OAuthToken) {
            let oauthToken = token;
            let user = oauthToken.getUserSignature();
            if (user != null) {
                tokenKey = user.getName();
            }
            else {
                let refreshToken = oauthToken.getRefreshToken();
                if (refreshToken != null && refreshToken.length > 0) {
                    tokenKey = refreshToken.substring(refreshToken.length - 32);
                }
                else {
                    let accessToken = oauthToken.getAccessToken();
                    if (accessToken != null && accessToken.length > 0) {
                        tokenKey = accessToken.substring(accessToken.length - 32);
                    }
                }
            }
        }
        let fileName = initializer.getEnvironment().getUrl();
        if (tokenKey != null && tokenKey.length > 0) {
            fileName = fileName + tokenKey;
        }
        var input = converter_js_1.Converter.toUTF8Array(fileName);
        var str = Buffer.from(input).toString('base64');
        return str + ".json";
    }
    static async getRelatedLists(relatedModuleName, moduleAPIName, commonAPIHandler) {
        try {
            let isnewData = false;
            let key = (moduleAPIName + constants_js_1.Constants.UNDERSCORE + constants_js_1.Constants.RELATED_LISTS).toLowerCase();
            let initializer = await initializer_js_1.Initializer.getInitializer().catch((err) => { throw err; });
            if (initializer == null || initializer == undefined) {
                throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.SDK_UNINITIALIZATION_ERROR, constants_js_1.Constants.SDK_UNINITIALIZATION_MESSAGE);
            }
            let resourcesPath = path.join(initializer.getResourcePath(), constants_js_1.Constants.FIELD_DETAILS_DIRECTORY);
            if (!fs.existsSync(resourcesPath)) {
                fs.mkdirSync(resourcesPath, { recursive: true });
            }
            var recordFieldDetailsPath = initializer.getResourcePath() + "resources/" + await this.getFileName().catch((err) => { throw err; });
            let recordFieldDetailsJSON = null;
            if (!fs.existsSync(recordFieldDetailsPath) || (fs.existsSync(recordFieldDetailsPath) && (!initializer_js_1.Initializer.getJSON(recordFieldDetailsPath).hasOwnProperty(key) || initializer_js_1.Initializer.getJSON(recordFieldDetailsPath)[key] == null || initializer_js_1.Initializer.getJSON(recordFieldDetailsPath)[key].length <= 0))) {
                isnewData = true;
                moduleAPIName = await Utility.verifyModuleAPIName(moduleAPIName).catch((err) => { throw err; });
                let relatedListValues = await this.getRelatedListDetails(moduleAPIName).catch((err) => { throw err; });
                recordFieldDetailsJSON = fs.existsSync(recordFieldDetailsPath) ? await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath) : {};
                recordFieldDetailsJSON[key] = relatedListValues;
                fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJSON));
            }
            recordFieldDetailsJSON = await initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
            let moduleRelatedList = recordFieldDetailsJSON.hasOwnProperty(key) ? recordFieldDetailsJSON[key] : {};
            if (!(await this.checkRelatedListExists(relatedModuleName, moduleRelatedList, commonAPIHandler).catch((err) => { throw err; })) && !isnewData) {
                delete recordFieldDetailsJSON[key];
                fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(recordFieldDetailsJSON));
                await Utility.getRelatedLists(relatedModuleName, moduleAPIName, commonAPIHandler).catch((err) => { throw err; });
            }
        }
        catch (error) {
            if (!(error instanceof sdk_exception_js_1.SDKException)) {
                error = new sdk_exception_js_1.SDKException(null, null, null, error);
            }
            winston_1.default.error(constants_js_1.Constants.EXCEPTION, error);
            throw error;
        }
    }
    static async checkRelatedListExists(relatedModuleName, modulerelatedListArray, commonAPIHandler) {
        for (let index = 0; index < modulerelatedListArray.length; index++) {
            const relatedListObject = modulerelatedListArray[index];
            if (relatedListObject[constants_js_1.Constants.API_NAME] != null && relatedListObject[constants_js_1.Constants.API_NAME].toLowerCase() == relatedModuleName.toLowerCase()) {
                if (relatedListObject[constants_js_1.Constants.HREF].toLowerCase() == constants_js_1.Constants.NULL_VALUE) {
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.UNSUPPORTED_IN_API, commonAPIHandler.getHttpMethod() + " " + commonAPIHandler.getAPIPath() + constants_js_1.Constants.UNSUPPORTED_IN_API_MESSAGE);
                }
                if (relatedListObject[constants_js_1.Constants.MODULE].toLowerCase() != constants_js_1.Constants.NULL_VALUE) {
                    commonAPIHandler.setModuleAPIName(relatedListObject[constants_js_1.Constants.MODULE]);
                    await Utility.getFieldsInfo(relatedListObject[constants_js_1.Constants.MODULE], commonAPIHandler).catch((err) => { throw err; });
                }
                return true;
            }
        }
        return false;
    }
    static async getRelatedListDetails(moduleAPIName) {
        let RelatedListsOperations = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/related_lists/related_lists_operations.js")))).RelatedListsOperations;
        let ResponseWrapper = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/related_lists/response_wrapper.js")))).ResponseWrapper;
        let APIException = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/related_lists/api_exception.js")))).APIException;
        let GetRelatedListsParam = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/related_lists/related_lists_operations.js")))).GetRelatedListsParam;
        let ParameterMap = (await Promise.resolve().then(() => __importStar(require("../../routes/parameter_map.js")))).ParameterMap;
        let relatedListArray = [];
        let paramInstance = new ParameterMap();
        await paramInstance.add(GetRelatedListsParam.MODULE, moduleAPIName);
        let response = await new RelatedListsOperations().getRelatedLists(paramInstance).catch((err) => { throw err; });
        if (response != null) {
            if (response.getStatusCode() == constants_js_1.Constants.NO_CONTENT_STATUS_CODE) {
                return relatedListArray;
            }
            let responseObject = response.getObject();
            if (responseObject != null) {
                if (responseObject instanceof ResponseWrapper) {
                    let relatedLists = responseObject.getRelatedLists();
                    relatedLists.forEach((relatedList) => {
                        let relatedListDetail = {};
                        relatedListDetail[constants_js_1.Constants.API_NAME] = relatedList.getAPIName();
                        relatedListDetail[constants_js_1.Constants.MODULE] = relatedList.getModule() != null ? relatedList.getModule().getAPIName() : constants_js_1.Constants.NULL_VALUE;
                        relatedListDetail[constants_js_1.Constants.NAME] = relatedList.getName();
                        relatedListDetail[constants_js_1.Constants.HREF] = relatedList.getHref() != null ? relatedList.getHref() : constants_js_1.Constants.NULL_VALUE;
                        relatedListArray.push(relatedListDetail);
                    });
                }
                else if (responseObject instanceof APIException) {
                    let errorResponse = {};
                    errorResponse[constants_js_1.Constants.CODE] = responseObject.getCode().getValue();
                    errorResponse[constants_js_1.Constants.STATUS] = responseObject.getStatus().getValue();
                    errorResponse[constants_js_1.Constants.MESSAGE] = responseObject.getMessage();
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
                }
                else {
                    let errorResponse = {};
                    errorResponse[constants_js_1.Constants.CODE] = response.getStatusCode();
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
                }
            }
        }
        return relatedListArray;
    }
    /**
     * This method is to get module field data from Zoho CRM.
     * @param {string} moduleAPIName - A String containing the CRM module API name.
     * @returns {object} An Object representing the Zoho CRM module field details.
     */
    static async getFieldsDetails(moduleAPIName) {
        let FieldOperations = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/fields/fields_operations.js")))).FieldsOperations;
        let FieldsResponseWrapper = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/fields/response_wrapper.js")))).ResponseWrapper;
        let APIException = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/fields/api_exception.js")))).APIException;
        let ParameterMap = (await Promise.resolve().then(() => __importStar(require("../../routes/parameter_map.js")))).ParameterMap;
        let GetFieldsParam = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/fields/fields_operations.js")))).GetFieldsParam;
        let paramInstance = new ParameterMap();
        await paramInstance.add(GetFieldsParam.MODULE, moduleAPIName);
        let response = await new FieldOperations().getFields(paramInstance).catch((err) => { throw err; });
        let fieldsDetails = {};
        if (response != null) {
            if (response.getStatusCode() == constants_js_1.Constants.NO_CONTENT_STATUS_CODE) {
                return fieldsDetails;
            }
            let responseHandler = response.getObject();
            if (responseHandler != null) {
                if (responseHandler instanceof FieldsResponseWrapper) {
                    let fields = await responseHandler.getFields();
                    for (let field in fields) {
                        let keyName = fields[field].getAPIName();
                        if (constants_js_1.Constants.KEYS_TO_SKIP.includes(keyName)) {
                            continue;
                        }
                        let fieldDetail = {};
                        await Utility.setDataType(fieldDetail, fields[field], moduleAPIName).catch((err) => { throw err; });
                        fieldsDetails[fields[field].getAPIName()] = fieldDetail;
                    }
                    if ((constants_js_1.Constants.INVENTORY_MODULES.includes(moduleAPIName.toLowerCase()))) {
                        let fieldDetail = {};
                        fieldDetail[constants_js_1.Constants.NAME] = constants_js_1.Constants.LINE_TAX;
                        fieldDetail[constants_js_1.Constants.TYPE] = constants_js_1.Constants.LIST_NAMESPACE;
                        fieldDetail[constants_js_1.Constants.STRUCTURE_NAME] = constants_js_1.Constants.LINE_TAX_NAMESPACE;
                        fieldDetail[constants_js_1.Constants.LOOKUP] = true;
                        fieldsDetails[constants_js_1.Constants.LINE_TAX] = fieldDetail;
                    }
                    if (moduleAPIName.toLowerCase() == constants_js_1.Constants.NOTES) {
                        let fieldDetail = {};
                        fieldDetail[constants_js_1.Constants.NAME] = constants_js_1.Constants.ATTACHMENTS;
                        fieldDetail[constants_js_1.Constants.TYPE] = constants_js_1.Constants.LIST_NAMESPACE;
                        fieldDetail[constants_js_1.Constants.STRUCTURE_NAME] = constants_js_1.Constants.ATTACHMENTS_NAMESPACE;
                        fieldsDetails[constants_js_1.Constants.ATTACHMENTS] = fieldDetail;
                    }
                }
                else if (responseHandler instanceof APIException) {
                    let errorResponse = {};
                    errorResponse[constants_js_1.Constants.CODE] = responseHandler.getCode().getValue();
                    errorResponse[constants_js_1.Constants.STATUS] = responseHandler.getStatus().getValue();
                    errorResponse[constants_js_1.Constants.MESSAGE] = responseHandler.getMessage();
                    let exception = new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
                    if (this.moduleAPIName != null && this.moduleAPIName.toLowerCase() == moduleAPIName.toLowerCase()) {
                        throw exception;
                    }
                    winston_1.default.error(constants_js_1.Constants.API_EXCEPTION, exception);
                }
            }
            else {
                let errorResponse = {};
                errorResponse[constants_js_1.Constants.CODE] = response.getStatusCode();
                throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
            }
        }
        return fieldsDetails;
    }
    static async verifyPhotoSupport(moduleAPIName) {
        try {
            moduleAPIName = await Utility.verifyModuleAPIName(moduleAPIName).catch((err) => { throw err; });
            if (constants_js_1.Constants.PHOTO_SUPPORTED_MODULES.includes(moduleAPIName.toLowerCase())) {
                return true;
            }
            let modules = await Utility.getModuleNames().catch((err) => {
                throw err;
            });
            if (modules.hasOwnProperty(moduleAPIName.toLowerCase()) && modules[moduleAPIName.toLowerCase()] != null) {
                let moduleMetaData = modules[moduleAPIName.toLowerCase()];
                if (moduleMetaData.hasOwnProperty(constants_js_1.Constants.GENERATED_TYPE) && moduleMetaData[constants_js_1.Constants.GENERATED_TYPE] != constants_js_1.Constants.GENERATED_TYPE_CUSTOM) {
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.UPLOAD_PHOTO_UNSUPPORTED_ERROR, constants_js_1.Constants.UPLOAD_PHOTO_UNSUPPORTED_MESSAGE + moduleAPIName);
                }
            }
        }
        catch (error) {
            if (!(error instanceof sdk_exception_js_1.SDKException)) {
                error = new sdk_exception_js_1.SDKException(null, null, null, error);
            }
            winston_1.default.error(constants_js_1.Constants.EXCEPTION, error);
            throw error;
        }
        return true;
    }
    static async getModuleNames() {
        let moduleData = {};
        let initializer = await initializer_js_1.Initializer.getInitializer().catch((err) => { throw err; });
        if (initializer == null || initializer == undefined) {
            throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.SDK_UNINITIALIZATION_ERROR, constants_js_1.Constants.SDK_UNINITIALIZATION_MESSAGE);
        }
        var resourcesPath = path.join(initializer.getResourcePath(), constants_js_1.Constants.FIELD_DETAILS_DIRECTORY);
        if (!fs.existsSync(resourcesPath)) {
            fs.mkdirSync(resourcesPath, { recursive: true });
        }
        let recordFieldDetailsPath = await this.getFileName().catch((err) => { throw err; });
        let fieldMetaJSON = initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
        if (!fs.existsSync(recordFieldDetailsPath) || (fs.existsSync(recordFieldDetailsPath) && (!fieldMetaJSON.hasOwnProperty(constants_js_1.Constants.SDK_MODULE_METADATA) || fieldMetaJSON[constants_js_1.Constants.SDK_MODULE_METADATA] == null || fieldMetaJSON[constants_js_1.Constants.SDK_MODULE_METADATA].length <= 0))) {
            moduleData = await Utility.getModules(null).catch((err) => { throw err; });
            await Utility.writeModuleMetaData(recordFieldDetailsPath, moduleData).catch((err) => { throw err; });
            return moduleData;
        }
        let recordFieldDetailsJson = initializer_js_1.Initializer.getJSON(recordFieldDetailsPath);
        return recordFieldDetailsJson[constants_js_1.Constants.SDK_MODULE_METADATA];
    }
    static async writeModuleMetaData(recordFieldDetailsPath, moduleData) {
        let fieldDetailsJSON = fs.existsSync(recordFieldDetailsPath) ? initializer_js_1.Initializer.getJSON(recordFieldDetailsPath) : {};
        fieldDetailsJSON[constants_js_1.Constants.SDK_MODULE_METADATA] = moduleData;
        fs.writeFileSync(recordFieldDetailsPath, JSON.stringify(fieldDetailsJSON));
    }
    static async getModules(header) {
        const HeaderMap = (await Promise.resolve().then(() => __importStar(require("../../routes/header_map.js")))).HeaderMap;
        let ResponseWrapper = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/modules/response_wrapper.js")))).ResponseWrapper;
        let APIException = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/modules/api_exception.js")))).APIException;
        const ModuleOperations = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/modules/modules_operations.js")))).ModulesOperations;
        const GetModulesHeader = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/modules/modules_operations.js")))).GetModulesHeader;
        let apiNames = {};
        let headerMap = new HeaderMap();
        if (header != null) {
            await headerMap.add(GetModulesHeader.IF_MODIFIED_SINCE, new Date(header));
        }
        let response = await new ModuleOperations().getModules(headerMap).catch((err) => { throw err; });
        if (response != null) {
            if ([constants_js_1.Constants.NO_CONTENT_STATUS_CODE, constants_js_1.Constants.NOT_MODIFIED_STATUS_CODE].includes(response.getStatusCode())) {
                return apiNames;
            }
            let responseObject = response.getObject();
            if (responseObject != null) {
                if (responseObject instanceof ResponseWrapper) {
                    let modules = responseObject.getModules();
                    modules.forEach((module) => {
                        if (module.getAPISupported() == true) {
                            let moduleDetails = {};
                            moduleDetails[constants_js_1.Constants.API_NAME] = module.getAPIName();
                            moduleDetails[constants_js_1.Constants.GENERATED_TYPE] = module.getGeneratedType().getValue();
                            apiNames[module.getAPIName().toLowerCase()] = moduleDetails;
                        }
                    });
                }
                else if (responseObject instanceof APIException) {
                    let errorResponse = {};
                    errorResponse[constants_js_1.Constants.CODE] = responseObject.getCode().getValue();
                    errorResponse[constants_js_1.Constants.STATUS] = responseObject.getStatus().getValue();
                    errorResponse[constants_js_1.Constants.MESSAGE] = responseObject.getMessage();
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
                }
            }
        }
        if (header == null) {
            try {
                let initializer = await initializer_js_1.Initializer.getInitializer().catch((err) => { throw err; });
                if (initializer == null || initializer == undefined) {
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.SDK_UNINITIALIZATION_ERROR, constants_js_1.Constants.SDK_UNINITIALIZATION_MESSAGE);
                }
                var resourcesPath = path.join(initializer.getResourcePath(), constants_js_1.Constants.FIELD_DETAILS_DIRECTORY);
                if (!fs.existsSync(resourcesPath)) {
                    fs.mkdirSync(resourcesPath, { recursive: true });
                }
                var recordFieldDetailsPath = resourcesPath + "/" + await this.getFileName().catch((err) => { throw err; });
                await Utility.writeModuleMetaData(recordFieldDetailsPath, apiNames).catch((err) => { throw err; });
            }
            catch (error) {
                if (!(error instanceof sdk_exception_js_1.SDKException)) {
                    error = new sdk_exception_js_1.SDKException(null, null, null, error);
                }
                winston_1.default.error(constants_js_1.Constants.EXCEPTION, error);
                throw error;
            }
        }
        return apiNames;
    }
    static async refreshModules() {
        this.forceRefresh = true;
        await Utility.getFieldsInfo(null).catch((err) => { throw err; });
        this.forceRefresh = false;
    }
    static async getJSONObject(json, key) {
        let keyArray = Array.from(Object.keys(json));
        for (let keyInJSON of keyArray) {
            if (key.toLowerCase() == keyInJSON.toLowerCase()) {
                return json[keyInJSON];
            }
        }
        return null;
    }
    static async setDataType(fieldDetail, field, moduleAPIName) {
        var apiType = field.getDataType();
        var keyName = field.getAPIName();
        var module = new minified_module_js_1.MinifiedModule();
        if (field.getSystemMandatory() != null && field.getSystemMandatory() == true && !(moduleAPIName.toLowerCase() == constants_js_1.Constants.CALLS && keyName.toLowerCase() == constants_js_1.Constants.CALL_DURATION)) {
            fieldDetail.required = true;
        }
        if (keyName.toLowerCase() == constants_js_1.Constants.PRICING_DETAILS_API_NAME.toLowerCase() && moduleAPIName.toLowerCase() == constants_js_1.Constants.PRICE_BOOKS) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LIST_NAMESPACE;
            fieldDetail.structure_name = constants_js_1.Constants.PRICING_DETAILS;
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            return;
        }
        else if (keyName.toLowerCase() == constants_js_1.Constants.PARTICIPANT_API_NAME.toLowerCase() && (moduleAPIName.toLowerCase() == constants_js_1.Constants.EVENTS || moduleAPIName.toLowerCase() == constants_js_1.Constants.ACTIVITIES)) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LIST_NAMESPACE;
            fieldDetail.structure_name = constants_js_1.Constants.PARTICIPANTS;
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            return;
        }
        else if (keyName.toLowerCase() == constants_js_1.Constants.COMMENTS.toLowerCase() && (moduleAPIName.toLowerCase() == constants_js_1.Constants.SOLUTIONS || moduleAPIName.toLowerCase() == constants_js_1.Constants.CASES)) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LIST_NAMESPACE;
            fieldDetail.structure_name = constants_js_1.Constants.COMMENT_NAMESPACE;
            fieldDetail.lookup = true;
            return;
        }
        else if (keyName.toLowerCase() == constants_js_1.Constants.LAYOUT.toLowerCase()) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LAYOUT_NAMESPACE;
            fieldDetail.structure_name = constants_js_1.Constants.LAYOUT_NAMESPACE;
            fieldDetail.lookup = true;
            return;
        }
        else if ((keyName.toLowerCase() == constants_js_1.Constants.TERRITORIES.toLowerCase() || keyName.toLowerCase() == constants_js_1.Constants.TERRITORY.toLowerCase()) && field.getCustomField() !== null && field.getCustomField() == false) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LIST_NAMESPACE;
            fieldDetail.structure_name = constants_js_1.Constants.TERRITORY_NAMESPACE;
            fieldDetail.lookup = true;
            return;
        }
        else if (keyName.toLowerCase() == constants_js_1.Constants.PRODUCT_NAME.toLowerCase() && constants_js_1.Constants.INVENTORY_MODULES_ITEMS.includes(moduleAPIName.toLowerCase())) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LINEITEM_PRODUCT;
            fieldDetail.structure_name = constants_js_1.Constants.LINEITEM_PRODUCT;
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            return;
        }
        else if (keyName.toLowerCase() == constants_js_1.Constants.DISCOUNT.toLowerCase() && constants_js_1.Constants.INVENTORY_MODULES_ITEMS.includes(moduleAPIName.toLowerCase())) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.STRING_NAMESPACE;
            return;
        }
        else if (keyName.toLowerCase() == constants_js_1.Constants.TAX.toLowerCase() && constants_js_1.Constants.PRODUCTS.toLowerCase() == moduleAPIName.toLowerCase()) {
            fieldDetail.name = keyName;
            fieldDetail.type = constants_js_1.Constants.LIST_NAMESPACE;
            fieldDetail.structure_name = constants_js_1.Constants.TAX_NAMESPACE;
            return;
        }
        else if (Utility.apiTypeVsDataType.has(apiType)) {
            fieldDetail.type = Utility.apiTypeVsDataType.get(apiType);
        }
        else if (apiType.toLowerCase() == constants_js_1.Constants.FORMULA.toLowerCase()) {
            if (field.getFormula() != null) {
                let returnType = field.getFormula().getReturnType();
                if (returnType != null && Utility.apiTypeVsDataType.has(returnType) && Utility.apiTypeVsDataType.get(returnType) != null) {
                    fieldDetail.type = Utility.apiTypeVsDataType.get(returnType);
                }
            }
            fieldDetail[constants_js_1.Constants.READ_ONLY] = true;
        }
        else if (apiType.toLowerCase() == constants_js_1.Constants.ROLLUP_SUMMARY.toLowerCase()) {
            if (field.getRollupSummary() != null) {
                const returnType = field.getRollupSummary().getReturnType();
                if (Utility.apiTypeVsDataType.get(returnType) != null) {
                    fieldDetail.type = Utility.apiTypeVsDataType.get(returnType);
                }
                else if (Utility.apiTypeVsDataType.get(field.getJsonType()) != null) {
                    fieldDetail.type = Utility.apiTypeVsDataType.get(field.getJsonType());
                }
            }
        }
        else {
            return;
        }
        if (apiType.toLowerCase().includes(constants_js_1.Constants.LOOKUP.toLowerCase())) {
            fieldDetail.lookup = true;
        }
        if (apiType.toLowerCase() == constants_js_1.Constants.CONSENT_LOOKUP || apiType.toLowerCase() == constants_js_1.Constants.OWNER_LOOKUP) {
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
        }
        if (apiType.toLowerCase() == constants_js_1.Constants.MULTI_SELECT_LOOKUP) {
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            if (field.getMultiselectlookup() != null && field.getMultiselectlookup().getLinkingModule() != null) {
                let linkingModule = field.getMultiselectlookup().getLinkingModule();
                fieldDetail[constants_js_1.Constants.MODULE] = linkingModule.getAPIName();
                module = linkingModule;
            }
            fieldDetail[constants_js_1.Constants.SUBFORM] = true;
        }
        if (apiType.toLowerCase() == constants_js_1.Constants.MULTI_USER_LOOKUP) {
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            if (field.getMultiuserlookup() != null && field.getMultiuserlookup().getLinkingModule() != null) {
                let linkingModule = field.getMultiuserlookup().getLinkingModule();
                fieldDetail[constants_js_1.Constants.MODULE] = linkingModule.getAPIName();
                module = linkingModule;
            }
            fieldDetail[constants_js_1.Constants.SUBFORM] = true;
        }
        if (apiType.toLowerCase() == constants_js_1.Constants.MULTI_MODULE_LOOKUP) {
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            fieldDetail[constants_js_1.Constants.SUBFORM] = true;
        }
        if (Utility.apiTypeVsStructureName.has(apiType)) {
            fieldDetail.structure_name = Utility.apiTypeVsStructureName.get(apiType);
        }
        if (apiType.toLowerCase() == constants_js_1.Constants.PICKLIST && field.getPickListValues() != null && field.getPickListValues().length > 0) {
            let values = [];
            fieldDetail.picklist = true;
            field.getPickListValues().every((x) => values.push(x.getDisplayValue()));
            fieldDetail.values = values;
        }
        if (apiType == constants_js_1.Constants.SUBFORM && field.getAssociatedModule() != null) {
            module.setAPIName(field.getAssociatedModule().getModule());
            fieldDetail.module = module.getAPIName();
            fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
            fieldDetail.subform = true;
        }
        if (apiType == constants_js_1.Constants.LOOKUP && field.getLookup() != null) {
            let module1 = field.getLookup().getModule();
            if (module1 != null && module1.getAPIName().toLowerCase() != constants_js_1.Constants.SE_MODULE) {
                module.setAPIName(module1.getAPIName());
                module.setId(module1.getId());
                fieldDetail.module = module.getAPIName();
                if (module1.getAPIName().toLowerCase() == constants_js_1.Constants.ACCOUNTS && field.getCustomField() != null && !field.getCustomField()) {
                    fieldDetail[constants_js_1.Constants.SKIP_MANDATORY] = true;
                }
            }
            else {
                const MinifiedModule = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/modules/minified_module.js")))).MinifiedModule;
                module = new MinifiedModule();
            }
            fieldDetail.lookup = true;
        }
        if (module != null && module.getAPIName() != null && module.getAPIName().length > 0) {
            await Utility.getFieldsInfo(module.getAPIName()).catch((err) => { throw err; });
        }
        fieldDetail.name = keyName;
    }
    static async fillDataType() {
        if (this.apiTypeVsDataType.size > 0) {
            return;
        }
        let fieldAPINamesString = [
            "textarea",
            "text",
            "website",
            "email",
            "phone",
            "mediumtext",
            "profileimage",
            "autonumber",
        ];
        let fieldAPINamesInteger = ["integer"];
        let fieldAPINamesBoolean = ["boolean"];
        let fieldAPINamesLong = ["long", "bigint"];
        let fieldAPINamesDouble = ["double", "percent", "lookup", "currency"];
        let fieldAPINamesFieldFile = ["fileupload"];
        let fieldAPINamesDateTime = ["datetime", "event_reminder"];
        let fieldAPINamesDate = ["date"];
        let fieldAPINamesLookup = ["lookup"];
        let fieldAPINamesPickList = ["picklist"];
        let fieldAPINamesMultiSelectPickList = ["multiselectpicklist"];
        let fieldAPINamesSubForm = ["subform"];
        let fieldAPINamesOwnerLookUp = ["ownerlookup", "userlookup"];
        let fieldAPINamesMultiUserLookUp = ["multiuserlookup"];
        let fieldAPINameTaskRemindAt = ["ALARM"];
        let fieldAPINameRecurringActivity = ["RRULE"];
        let fieldAPINameReminder = ["multireminder"];
        let fieldAPINameConsentLookUp = ["consent_lookup"];
        let fieldAPINameImageUpload = ["imageupload"];
        let fieldAPInameMultiSelectLookUp = ["multiselectlookup"];
        let fieldAPINameLineTax = ["linetax"];
        let fieldAPINamesModule = ["module"];
        let fieldAPINamesLayout = ["layout"];
        let fieldAPINamesMultiModuleLookUp = ["multi_module_lookup"];
        let fieldAPINamesTimeRange = ["time_range"];
        for (let fieldAPIName of fieldAPINamesString) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.STRING_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesInteger) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.INTEGER_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesBoolean) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.BOOLEAN_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesLong) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LONG_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesDouble) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.DOUBLE_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesDateTime) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.DATETIME_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesDate) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.DATE_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesLookup) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.RECORD_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.RECORD_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesPickList) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.CHOICE_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesMultiSelectPickList) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.CHOICE_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesSubForm) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.RECORD_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesOwnerLookUp) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.USER_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.USER_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesMultiUserLookUp) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.USER_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesFieldFile) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.FIELD_FILE_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINameTaskRemindAt) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.REMINDAT_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.REMINDAT_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINameRecurringActivity) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.RECURRING_ACTIVITY_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.RECURRING_ACTIVITY_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINameReminder) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.REMINDER_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINameConsentLookUp) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.CONSENT_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.CONSENT_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINameImageUpload) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.IMAGEUPLOAD_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPInameMultiSelectLookUp) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.RECORD_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINameLineTax) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.LINETAX);
        }
        for (let fieldAPIName of fieldAPINamesModule) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.MODULE_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.MODULE_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesMultiModuleLookUp) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.RECORD_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.RECORD_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesLayout) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LAYOUT_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.LAYOUT_NAMESPACE);
        }
        for (let fieldAPIName of fieldAPINamesTimeRange) {
            Utility.apiTypeVsDataType.set(fieldAPIName, constants_js_1.Constants.LIST_NAMESPACE);
            Utility.apiTypeVsStructureName.set(fieldAPIName, constants_js_1.Constants.TIME_RANGE_NAMESPACE);
        }
    }
    async getUserName(token) {
        const HeaderMap = (await Promise.resolve().then(() => __importStar(require("../../routes/header_map.js")))).HeaderMap;
        const Header = (await Promise.resolve().then(() => __importStar(require("../../routes/header.js")))).Header;
        const ParameterMap = (await Promise.resolve().then(() => __importStar(require("../../routes/parameter_map.js")))).ParameterMap;
        let ResponseWrapper = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/users/response_wrapper.js")))).ResponseWrapper;
        let APIException = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/users/api_exception.js")))).APIException;
        const GetUsersParam = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/users/users_operations.js")))).GetUsersParam;
        let userName = null;
        let paramInstance = new ParameterMap();
        await paramInstance.add(GetUsersParam.TYPE, new choice_js_1.Choice(constants_js_1.Constants.CURRENTUSER));
        let headerInstance = new HeaderMap();
        var handlerInstance = new zohocrmsdk_js_1.CommonAPIHandler();
        var apiPath = '';
        apiPath = apiPath.concat("/crm/v6/users");
        handlerInstance.setAPIPath(apiPath);
        handlerInstance.setHttpMethod(constants_js_1.Constants.REQUEST_METHOD_GET);
        handlerInstance.setCategoryMethod(constants_js_1.Constants.REQUEST_CATEGORY_READ);
        handlerInstance.setParam(paramInstance);
        await headerInstance.add(await new Header(constants_js_1.Constants.AUTHORIZATION, constants_js_1.Constants.STRING_NAMESPACE), constants_js_1.Constants.OAUTH_HEADER_PREFIX + token);
        handlerInstance.setHeader(headerInstance);
        let ResponseHandler = require.resolve("../../core/com/zoho/crm/api/users/response_handler.js");
        let response = await handlerInstance.apiCall(ResponseHandler, "application/json").catch((err) => { throw err; });
        if (response != null) {
            if ([204, 304].includes(response.getStatusCode())) {
                return null;
            }
            //Get object from response
            let responseObject = response.getObject();
            if (responseObject != null) {
                if (responseObject instanceof ResponseWrapper) {
                    let users = responseObject.getUsers();
                    for (let user of users) {
                        userName = user.getEmail();
                        break;
                    }
                }
                else if (responseObject instanceof APIException) {
                    let errorResponse = {};
                    errorResponse[constants_js_1.Constants.CODE] = responseObject.getCode().getValue();
                    errorResponse[constants_js_1.Constants.STATUS] = responseObject.getStatus().getValue();
                    errorResponse[constants_js_1.Constants.MESSAGE] = responseObject.getMessage();
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
                }
            }
        }
        let org = await this.getUserOrgID(token);
        return userName + ":" + org;
    }
    async getUserOrgID(token) {
        const HeaderMap = (await Promise.resolve().then(() => __importStar(require("../../routes/header_map.js")))).HeaderMap;
        const Header = (await Promise.resolve().then(() => __importStar(require("../../routes/header.js")))).Header;
        let ResponseWrapper = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/org/response_wrapper.js")))).ResponseWrapper;
        let APIException = (await Promise.resolve().then(() => __importStar(require("../../core/com/zoho/crm/api/org/api_exception.js")))).APIException;
        var handlerInstance = new zohocrmsdk_js_1.CommonAPIHandler();
        var apiPath = '';
        apiPath = apiPath.concat("/crm/v6/org");
        handlerInstance.setAPIPath(apiPath);
        handlerInstance.setHttpMethod(constants_js_1.Constants.REQUEST_METHOD_GET);
        handlerInstance.setCategoryMethod(constants_js_1.Constants.REQUEST_CATEGORY_READ);
        let headerInstance = new HeaderMap();
        await headerInstance.add(await new Header(constants_js_1.Constants.AUTHORIZATION, constants_js_1.Constants.STRING_NAMESPACE), constants_js_1.Constants.OAUTH_HEADER_PREFIX + token);
        handlerInstance.setHeader(headerInstance);
        let ResponseHandler = require.resolve("../../core/com/zoho/crm/api/org/response_handler.js");
        let response = await handlerInstance.apiCall(ResponseHandler, "application/json").catch((err) => { throw err; });
        if (response != null) {
            let responseObject = response.getObject();
            if (responseObject != null) {
                if (responseObject instanceof ResponseWrapper) {
                    let orgs = responseObject.getOrg();
                    for (let org of orgs) {
                        return org.getZgid();
                    }
                }
                else if (responseObject instanceof APIException) {
                    let errorResponse = {};
                    errorResponse[constants_js_1.Constants.CODE] = responseObject.getCode().getValue();
                    errorResponse[constants_js_1.Constants.STATUS] = responseObject.getStatus().getValue();
                    errorResponse[constants_js_1.Constants.MESSAGE] = responseObject.getMessage();
                    throw new sdk_exception_js_1.SDKException(constants_js_1.Constants.API_EXCEPTION, null, errorResponse, null);
                }
            }
        }
        return null;
    }
}
exports.Utility = Utility;
exports.MasterModel = Utility;
Utility.apiTypeVsDataType = new Map();
Utility.apiTypeVsStructureName = new Map();
Utility.newFile = false;
Utility.getModifiedModules = false;
Utility.forceRefresh = false;
Utility.moduleAPIName = null;
Utility.apiSupportedModule = {};