prepaid-advice.js 3.86 KB
const MODULE_NAME = 'HIT.PREPAID-ADVICE';

// const axios = require('axios').default;
const axios = require('axios/dist/node/axios.cjs');
const urljoin = require('url-join');

const config = require('komodo-sdk/config');
const logger = require('tektrans-logger');

const report = require('../report/prepaid');
const translateRc = require('../translate-rc');
const dumpReqRes = require('./dump-req-res');

module.exports = async (xid, task) => {
    logger.verbose(`${MODULE_NAME} 90350EF7: Processing task`, {
        xid,
        task,
    });

    const params = {
        request_id: task.trx_id,
        terminal_name: config.partner.terminal_name,
        password: config.partner.password,
    };

    const endpointUrl = urljoin(config.partner.url, '/trx-status');
    let lastResponse = null;

    try {
        logger.verbose(`${MODULE_NAME} 453A48DC: Going to HIT ADVICE endpoint`, {
            xid,
            endpointUrl,
            params,
        });

        const response = await axios.get(endpointUrl, {
            headers: {
                'User-Agent': 'KOMODO-GW-HTTPGETX',
            },
            timeout: config.partner.hit_timeout_ms || 10 * 1000,
            params,
        });

        if (!response) {
            const e = new Error(`${MODULE_NAME} FD20A1AF: Empty response`);
            e.rc = '68';
            e.response = response;
            throw e;
        }

        if (!response.data) {
            const e = new Error(`${MODULE_NAME} 17FF8971: Empty response data`);
            e.rc = '68';
            e.response = response;
            throw e;
        }

        if (typeof response.data !== 'object') {
            const e = new Error(`${MODULE_NAME} A6761E9F: Response data is not a JSON`);
            e.rc = '68';
            e.response = response;
            throw e;
        }

        lastResponse = response;

        logger.verbose(`${MODULE_NAME} 3B5C70C4: Got a direct response`, {
            xid,
            responseBody: response.data,
        });

        if (!response.data.trx_found || !response.data.trx) {
            report(xid, {
                trx_id: task.trx_id,
                rc: '40',
                message: {
                    xid,
                    'ADVICE-DIRECT-RESPONSE': response.data,
                },
            });

            return;
        }

        report(xid, {
            trx_id: task.trx_id,
            rc: response.data.trx.rc ? translateRc[response.data.trx.rc] || response.data.trx.rc
                : '68',
            sn: response.data.trx.sn || null,
            amount: Number(response.data.trx.amount) || undefined,
            balance: Number(response.data.trx.ending_balance) || undefined,
            message: {
                xid,
                'ADVICE-DIRECT-RESPONSE': response.data,
            },
        });
    } catch (e) {
        const rc = e.rc || '68';

        logger.warn(`${MODULE_NAME} 1427175A: Exception`, {
            xid,
            eCode: e.code,
            eMessage: e.message,
            eRc: e.rc,
            rc,
            responseHttpStatus: e.response && e.response.status,
            responseBody: e.response && e.response.data,
        });

        lastResponse = e.response;

        report(xid, {
            trx_id: task.trx_id,
            rc,
            message: {
                xid,
                'KOMODO-GW-ADVICE-ERROR': {
                    eCode: e.code,
                    eMessage: e.message,
                    responseHttpStatus: e.response && e.response.status,
                    responseBody: e.response && e.response.data,
                },
            },
        });
    } finally {
        dumpReqRes(
            xid,
            task,
            'GET',
            endpointUrl,
            params,
            lastResponse && lastResponse.data,
            lastResponse && lastResponse.status,
            lastResponse,
            true,
        );
    }
};