partner.js 3.06 KB
"use strict";

const request = require('request');
const config = require('komodo-sdk/config');
const logger = require('komodo-sdk/logger');
const matrix = require('komodo-sdk/matrix');
const pull = require('komodo-sdk/gateway/pull');

const misc = require('./partner-misc');

/**
 * Pembelian ke partner
 *
 * Merupakan fungsi mandatory yang harus dimiliki oleh setiap gateway.
 */
function buy(task) {
    _requestToPartner(task, false);
}

/**
 * Pemeriksaan status transaksi ke partner
 * Merupakan fungsi mandatory yang harus dimiliki oleh setiap gateway.
 */
function statusCheck(task) {
    _requestToPartner(task, true);
}

/**
 * Mengirim request ke partner.
 *
 * Untuk digunakan oleh buy dan checkStatus.
 */
function _requestToPartner(task, pendingOnError) {

    const requestOptions = misc.createRequestOptions(task, config);

    logger.verbose('Requeting to partner', {requestOptions: requestOptions});
    request.post(requestOptions, function(err, res, body) {

        if (err) {

            let rc = '68';
            if (!pendingOnError) { rc = '91'; }

            logger.warn('Error requesting to partner', {task: task, err: err})

            reportToCore({
                trx_id: task.trx_id,
                rc: rc,
                message: 'Error requesting to partner: ' + err,
                handler: config.handler_name,
                task: task
            })

            return;
        }

        if (res.statusCode != 200) {
            let rc = '68';
            logger.warn('Partner returning non 200 HTTP STATUS CODE', {task: task, http_status_code: res.statusCode})

            reportToCore({
                trx_id: task.trx_id,
                rc: rc,
                message: 'Partner returning HTTP STATUS CODE ' + res.statusCode + ' instead of 200',
                handler: config.handler_name,
                task: task
            })

            return;
        }

        misc.processPartnerResponseBody(body, task);
    })
}

/**
 * Mengirim report hasil transaksi ke CORE
 */
function reportToCore(data) {
    pull.report(data);

    if (data && data.task && data.rc == '68') {
        let delay_ms = 60 * 1000;
        if (config.auto_resend && config.auto_resend.delay_ms) {
            delay_ms = Number(config.auto_resend.delay_ms);
        }

        let max_retry = 60;
        if (config.auto_resend && config.auto_resend.max_retry) {
            max_retry = Number(config.auto_resend.max_retry);
        }

        setTimeout(
            function() {

                if (data.task.remaining_retry === undefined) {
                    data.task.remaining_retry = max_retry;
                }

                if (data.task.remaining_retry--) {
                    logger.verbose('Got pending status, retrying', {task: data.task});
                    statusCheck(data.task);
                }
                else {
                    logger.verbose('Exceeding retry pending status', {task: data.task});
                }
            },
            delay_ms
        )
    }
}

exports.buy = buy;
exports.statusCheck = statusCheck;
exports.reportToCore = reportToCore;