diff --git a/apps/mno/src/modules/selcom/services/selcom.service.ts b/apps/mno/src/modules/selcom/services/selcom.service.ts index f19faa6..d31fa16 100644 --- a/apps/mno/src/modules/selcom/services/selcom.service.ts +++ b/apps/mno/src/modules/selcom/services/selcom.service.ts @@ -1,4 +1,4 @@ -import { APPENV, phoneNumber } from '@flexpay/common'; +import { APPENV, phoneNumber, requestResource } from '@flexpay/common'; import { HttpStatus, Injectable } from '@nestjs/common'; import { CheckoutResponse, MnoCheckout, ErrorResponse } from 'azampay'; import * as crypto from 'crypto'; @@ -47,14 +47,13 @@ export class SelcomService { payload: SelcomPayload, headers: Headers, ): Promise => { - const response = await fetch(url, { - method: 'POST', + const res = await requestResource({ + resource: url, headers, body: JSON.stringify(payload), + method: 'POST', }); - - const res = await response.json(); - res.statusCode = response.status; + console.log(res); return res; }; diff --git a/libs/common/src/helpers/base.helper.ts b/libs/common/src/helpers/base.helper.ts index 4c7a752..3973b7b 100644 --- a/libs/common/src/helpers/base.helper.ts +++ b/libs/common/src/helpers/base.helper.ts @@ -1,3 +1,10 @@ +import { HttpStatus, Logger } from '@nestjs/common'; +import { BaseRequest } from '../interfaces/shared.interface'; + +export const throwError = (error: any) => { + throw error; +}; + export const phoneNumber = (phone: string) => { if (!phone || phone.length < 9) return { valid: false, value: phone }; @@ -31,3 +38,53 @@ export const phoneNumber = (phone: string) => { withOutPlus, }; }; + +const logResponse = async (response: Response) => { + try { + if (response) { + Logger.error(response.statusText, 'RESPONSE TEXT'); + Logger.error(response.status, 'RESPONSE STATUS'); + Logger.error(response.url, 'RESPONSE URL'); + if (response.ok) { + console.log(await response.text()); + console.log(await response.json()); + } + } + } catch (e) { + Logger.error(e.message, 'ERROR LOGGING RESPONSE'); + console.log(e); + } +}; + +export const requestResource = async ( + request: BaseRequest, + requests = 0, +): Promise => { + let response: Response; + try { + response = await fetch(request.resource, { + ...request, + }); + const status = response.status; + response = await response.json(); + if (status >= 400) { + Logger.error(status, 'ERROR RESPONSE'); + console.log('ERROR RESPONSE', JSON.stringify(response)); + } + Logger.debug('REQUEST SUCCESSFUL', 'SUCCESS'); + Logger.debug(`${request.method} ${request.resource}`, 'URL'); + return { ...response, status, statusCode: status }; + } catch (e) { + if (requests <= 5) { + return await requestResource(request, requests + 1); + } + logResponse(response); + Logger.debug(`URL: ${request.resource}`, 'ERROR URL'); + console.log(e); + return { + error: e.message, + message: e.message, + statusCode: HttpStatus.BAD_REQUEST, + }; + } +}; diff --git a/libs/common/src/interfaces/shared.interface.ts b/libs/common/src/interfaces/shared.interface.ts index a94d995..a50c185 100644 --- a/libs/common/src/interfaces/shared.interface.ts +++ b/libs/common/src/interfaces/shared.interface.ts @@ -1,5 +1,12 @@ import { FindOptionsRelations, FindOptionsSelect } from 'typeorm'; +export interface BaseRequest { + resource: string; + body?: BodyInit; + headers: HeadersInit; + method: 'POST' | 'GET' | 'PUT' | 'PATCH' | 'DELETE'; +} + export interface ErrorResponse { status: number; error: string;