const MODULE_NAME = 'HIT.PREPAID'; const axios = require('axios').default; const urljoin = require('url-join'); const uniqid = require('uniqid'); const config = require('komodo-sdk/config'); const logger = require('komodo-sdk/logger'); const report = require('../report/prepaid'); const translateRc = require('../translate-rc'); const composeCallbackUrl = require('./compose-callback-url'); module.exports = async (task, isAdvice) => { const xid = uniqid(); const params = { request_id: task.trx_id, terminal_name: config.partner.terminal_name, password: config.partner.password, destination: task.destination, product_name: task.remote_product, reverse_url: composeCallbackUrl(xid, false), }; const endpointUrl = isAdvice ? urljoin(config.partner.url, '/trx-status') : urljoin(config.partner.url, '/topup'); try { logger.verbose(`${MODULE_NAME} 4AAD4F99: Going to HIT prepaid endpoint`, { xid, isAdvice, endpointUrl, params, }); const response = await axios.get(endpointUrl, { headers: { 'User-Agent': 'KOMODO-GW-HTTPGETX', }, timeout: config.partner.hit_timeout_ms || 60 * 1000, params, }); if (!response) { const e = new Error(`${MODULE_NAME} 8CF4E04D: Empty response`); e.rc = '68'; e.response = response; throw e; } if (!response.data) { const e = new Error(`${MODULE_NAME} E72B5A53: Empty response data`); e.rc = '68'; e.response = response; throw e; } if (typeof response.data !== 'object') { const e = new Error(`${MODULE_NAME} 507680AB: Response data is not a JSON`); e.rc = '68'; e.response = response; throw e; } logger.verbose(`${MODULE_NAME} E51AFBBA: Got a direct response`, { xid, responseBody: response.data, }); report(xid, { trx_id: task.trx_id, rc: response.data.rc ? translateRc[response.data.rc] || response.data.rc : '68', sn: response.data.sn || null, amount: 0, balance: 0, message: { xid, 'DIRECT-RESPONSE': response.data, 'IS-ADVICE': !!isAdvice, }, }); } catch (e) { const rc = e.rc || '68'; report(xid, { trx_id: task.trx_id, rc, message: { xid, 'KOMODO-GW-ERROR': { eCode: e.code, eMessage: e.message, responseHttpStatus: e.response && e.response.status, responseBody: e.response && e.response.data, }, 'IS-ADVICE': !!isAdvice, }, }); } };