omnipay-savings-sdk
Version:
Omnipay Savings SDK
282 lines (281 loc) • 12.2 kB
JavaScript
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;
;