Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions apps/mno/src/modules/selcom/services/selcom.service.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -47,14 +47,13 @@ export class SelcomService {
payload: SelcomPayload,
headers: Headers,
): Promise<any> => {
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;
};

Expand Down
57 changes: 57 additions & 0 deletions libs/common/src/helpers/base.helper.ts
Original file line number Diff line number Diff line change
@@ -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 };

Expand Down Expand Up @@ -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<any> => {
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,
};
}
};
7 changes: 7 additions & 0 deletions libs/common/src/interfaces/shared.interface.ts
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Loading