UNPKG

omnipay-savings-sdk

Version:

Omnipay Savings SDK

282 lines (281 loc) 12.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatRequestData = exports.getRequestHeaders = exports.GET = exports.PUT = exports.POST = exports.getGlobalEnv = exports.setGlobalEnv = exports.setTokenExpiryHandler = void 0; const dayjs_1 = __importDefault(require("dayjs")); const env_json_1 = require("../env.json"); const utils_1 = require("../utils"); // Global token expiry handler let globalTokenExpiryHandler = null; let globalEnv = null; const setTokenExpiryHandler = (handler) => { globalTokenExpiryHandler = handler; }; exports.setTokenExpiryHandler = setTokenExpiryHandler; const setGlobalEnv = (key) => { globalEnv = key; }; exports.setGlobalEnv = setGlobalEnv; const getGlobalEnv = () => { if (!globalEnv) { console.warn('getGlobalEnv() called before environment was set.'); } return globalEnv; }; exports.getGlobalEnv = getGlobalEnv; const handleTokenExpiry = () => { if (globalTokenExpiryHandler) { globalTokenExpiryHandler(); } }; let isRefreshingRequestToken = false; const POST = async (params) => { const { requestUrl, requestData, customHeaders, requestType, apiKey } = params; const env = (0, exports.getGlobalEnv)(); const API_BASE_URL = env === 'prod' ? env_json_1.API_PROD_BASE_URL : env_json_1.API_DEV_BASE_URL; try { let data = formatRequestData(requestData, requestType); const requestHeaders = await getRequestHeaders(apiKey, requestType); const headers = Object.assign(Object.assign({}, requestHeaders.headers), customHeaders); const response = await fetch(`${API_BASE_URL}${requestUrl}`, { method: 'POST', headers, body: JSON.stringify(data), }); const responseData = await response.json(); if (!response.ok || responseData.error === true) { // Handle 401 unauthorized responses if (response.status === 401) { handleTokenExpiry(); } return { error: extractDetailedErrorMessage(responseData), status: responseData === null || responseData === void 0 ? void 0 : responseData.status, }; } return responseData; } catch (error) { const errorMessage = getErrorMessage(error); const errorResponse = (error === null || error === void 0 ? void 0 : error.response) || {}; const errorData = errorResponse.data || {}; return Promise.reject(errorData); } }; exports.POST = POST; const PUT = async (params) => { const { requestUrl, requestData, customHeaders, requestType, apiKey } = params; try { let data = formatRequestData(requestData, requestType); const requestHeaders = await getRequestHeaders(apiKey, requestType); const headers = Object.assign(Object.assign({}, requestHeaders.headers), customHeaders); const env = (0, exports.getGlobalEnv)(); const API_BASE_URL = env === 'prod' ? env_json_1.API_PROD_BASE_URL : env_json_1.API_DEV_BASE_URL; const response = await fetch(`${API_BASE_URL}${requestUrl}`, { method: 'PUT', headers, body: JSON.stringify(data), }); const responseData = await response.json(); if (!response.ok || responseData.error === true) { // Handle 401 unauthorized responses if (response.status === 401) { handleTokenExpiry(); } return { error: extractDetailedErrorMessage(responseData), status: responseData === null || responseData === void 0 ? void 0 : responseData.status, }; } return responseData; } catch (error) { const errorMessage = getErrorMessage(error); const errorResponse = (error === null || error === void 0 ? void 0 : error.response) || {}; const errorData = errorResponse.data || {}; return Promise.reject(errorData); } }; exports.PUT = PUT; const GET = async (params) => { var _a, _b; const { requestUrl, customHeaders, apiKey } = params; try { const requestHeaders = await getRequestHeaders(apiKey); const headers = Object.assign(Object.assign({}, requestHeaders.headers), customHeaders); const env = (0, exports.getGlobalEnv)(); const API_BASE_URL = env === 'prod' ? env_json_1.API_PROD_BASE_URL : env_json_1.API_DEV_BASE_URL; let modifiedDateUrl = modifyUrl(requestUrl); const response = await fetch(`${API_BASE_URL}${modifiedDateUrl}`, { method: 'GET', headers, }); // console.log(response, `response`); if (!response.ok) { // Handle 401 unauthorized responses if (response.status === 401) { handleTokenExpiry(); } throw new Error(`HTTP error! status: ${response.status}`); } const responseData = await response.text(); console.log(responseData, 'response-data'); if (responseData.endsWith('.csv')) { return responseData; } return JSON.parse(responseData).responseData || JSON.parse(responseData); } catch (error) { // Handle fetch errors that might also be 401 if (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.includes('401')) || ((_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.status) === 401) { handleTokenExpiry(); } const errorMessage = getErrorMessage(error); throw new Error(errorMessage); } }; exports.GET = GET; function extractDetailedErrorMessage(responseData) { var _a, _b; // Extract detailed validation errors if available if (responseData.errors) { // Handle validation errors object if (typeof responseData.errors === 'object') { const errorMessages = []; // Check for array of errors if (Array.isArray(responseData.errors)) { errorMessages.push(...responseData.errors); } else { // Check for object with error properties for (const [key, value] of Object.entries(responseData.errors)) { if (Array.isArray(value)) { errorMessages.push(...value); } else if (typeof value === 'string') { errorMessages.push(value); } } } if (errorMessages.length > 0) { return errorMessages.join('. '); } } } // Fallback to message or title return ((_b = (_a = responseData.message) !== null && _a !== void 0 ? _a : responseData.title) !== null && _b !== void 0 ? _b : 'An error occurred. Please try again'); } function getErrorMessage(error) { var _a, _b, _c; const errorCode = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status; const errorData = (_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.data; const errorMessage = errorData === null || errorData === void 0 ? void 0 : errorData.message; if (error.message === 'Network Error') { return 'Check your network connection'; } if (errorCode === 500) { return 'Ooops. Please try again'; } if ((_c = error === null || error === void 0 ? void 0 : error.response) === null || _c === void 0 ? void 0 : _c.message) { if (typeof error.response.message === 'string') { return error.response.message; } } return typeof errorData === 'string' && errorData ? errorData : errorMessage || error.message; } async function getRequestHeaders(apiKey, requestType) { const token = apiKey; return { headers: Object.assign(Object.assign({}, (!!token && { authorization: `Bearer ${token}` })), { 'content-type': requestType === 'form-data' ? 'multipart/form-data' : 'application/json' }), }; } exports.getRequestHeaders = getRequestHeaders; function modifyUrl(requestUrl) { if (requestUrl.includes('?') && requestUrl.split('?')[1].includes('Date')) { const currentParamsObject = (0, utils_1.parseQueryString)(requestUrl.split('?')[1]); let newRequestParamsObject = {}; for (const key in currentParamsObject) { if (key.includes('StartDate') || key.includes('EndDate') || (key === 'date' && currentParamsObject.StartDate === undefined)) { const isSingleDateKey = key === 'date'; if (key.includes('StartDate') || isSingleDateKey) { const keySuffix = isSingleDateKey ? '' : key.split('StartDate')[0]; let endDateKey = `${keySuffix}EndDate`; if (endDateKey === 'createenddate') { endDateKey = 'createdenddate'; } let startDateValue = currentParamsObject[key]; let endDateValue = currentParamsObject[endDateKey]; if ((0, utils_1.isValidDate)(startDateValue)) { startDateValue = dayjs_1.default //@ts-ignore .utc((0, dayjs_1.default)(startDateValue, 'YYYY-MM-DD').startOf('day')) .format(); } if ((0, utils_1.isValidDate)(endDateValue)) { endDateValue = dayjs_1.default //@ts-ignore .utc((0, dayjs_1.default)(endDateValue, 'YYYY-MM-DD').endOf('day')) .format(); } //@ts-ignore newRequestParamsObject[key] = startDateValue; //@ts-ignore newRequestParamsObject[endDateKey] = endDateValue; } } else { if (Array.isArray(currentParamsObject[key])) { //@ts-ignore newRequestParamsObject[key] = currentParamsObject[key][0]; } else { //@ts-ignore newRequestParamsObject[key] = currentParamsObject[key]; } } } const newParamsUrl = Object.keys(newRequestParamsObject) //@ts-ignore .map(key => key + '=' + newRequestParamsObject[key]) .join('&'); let modifiedDateUrl = `${requestUrl.split('?')[0]}?${newParamsUrl}`; return modifiedDateUrl; } return requestUrl; } function formatRequestData(requestData, requestType) { if (requestType === 'form-data') { let fd = new FormData(); for (const el in requestData) { let data = requestData[el]; if (utils_1.formDataRequests.includes(el)) { const uriParts = data === null || data === void 0 ? void 0 : data.split('.'); const fileType = uriParts === null || uriParts === void 0 ? void 0 : uriParts[uriParts.length - 1]; if (data && uriParts && fileType) { // @ts-ignore fd.append(el, { uri: data, name: `${el}.${fileType}`, type: fileType.toLowerCase().includes('pdf') ? `application/${fileType.toLowerCase()}` : `image/${fileType.toLowerCase()}`, }); } } else { fd.append(el, data); } } return fd; } return requestData; } exports.formatRequestData = formatRequestData;