prepaid.js 2.96 KB
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,
            },
        });
    }
};