parse-result.js 3.21 KB
const MODULE_NAME = 'PARSE-RESULT';

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

const getParamsMemberObj = require('./generic-xmlrpc/get-params-members-obj');
const parseXml = require('./parse-xml');

const report = require('./report');
const translateRc = require('./translate-rc');

module.exports = (xid, trxIdFromCaller, xml, isCallback) => {
    logger.verbose(`${MODULE_NAME} 58547863: Processing XML message`, { xid, isCallback });

    const responseType = isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE';

    if (!trxIdFromCaller && !isCallback) {
        if (logger) logger.warn(`${MODULE_NAME} 8CAAD7C9: No trx id on non callback`, { xid });
        return;
    }

    const obj = parseXml(xid, xml);
    if (!obj) {
        const e = new Error(`${MODULE_NAME} B46CAAD1: Invalid XML`);
        logger.warn(e.message, { xid });

        if (trxIdFromCaller) {
            report(xid, {
                trx_id: trxIdFromCaller.toString(),
                rc: '68',
                message: {
                    xid,
                    responseType,
                    'GW-ERROR': {
                        message: e.message,
                        responseFromPartner: xml,
                    },
                },
            });
        }

        return;
    }

    const params = getParamsMemberObj(obj, false);

    if (!params) {
        const e = new Error(`${MODULE_NAME} A7B7EB30: Can not get params from message`);
        logger.warn(e.message, { xid });

        if (trxIdFromCaller) {
            report(xid, {
                trx_id: trxIdFromCaller.toString(),
                rc: '68',
                message: {
                    xid,
                    responseType,
                    'GW-ERROR': {
                        message: e.message,
                        responseFromPartner: obj,
                    },
                },
            });
        }
    }

    logger.verbose(`${MODULE_NAME} 3D5400C1: Params extracted from response`, { xid, params });

    const requestIdField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.requestId) || 'REQUESTID';
    const requestIdFromResponse = params[requestIdField];

    const responseCodeField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.responseCode) || 'RESPONSECODE';
    const responseCodeFromResponse = params[responseCodeField];

    // eslint-disable-next-line max-len
    // const messageField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.message) || 'MESSAGE';
    // const messageFromResponse = params[messageField];

    const snField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.sn) || 'SN';
    const snFromResponse = params[snField];

    const trxId = trxIdFromCaller || requestIdFromResponse;
    if (!trxId) {
        logger.warn(`${MODULE_NAME} 534E684A: Unknown trxId`, { xid });
        return;
    }

    const rc = translateRc(xid, responseCodeFromResponse) || '68';

    const sn = (rc === '00' && snFromResponse) || null;

    report(xid, {
        trx_id: trxId.toString(),
        rc,
        sn,
        message: {
            xid,
            responseType: isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE',
            message: params,
        },
    });
};