Commit 15b9e672b358e957cc5aba5c1ab24835c8e204d9

Authored by Adhidarma Hadiwinoto
1 parent e62a7694fd
Exists in master

Fix custom rules

Showing 1 changed file with 32 additions and 2 deletions Inline Diff

1 const MODULE_NAME = 'PARSE-RESULT'; 1 const MODULE_NAME = 'PARSE-RESULT';
2 2
3 const config = require('komodo-sdk/config'); 3 const config = require('komodo-sdk/config');
4 const logger = require('tektrans-logger'); 4 const logger = require('tektrans-logger');
5 5
6 const getParamsMemberObj = require('./generic-xmlrpc/get-params-members-obj'); 6 const getParamsMemberObj = require('./generic-xmlrpc/get-params-members-obj');
7 const parseXml = require('./parse-xml'); 7 const parseXml = require('./parse-xml');
8 8
9 const report = require('./report'); 9 const report = require('./report');
10 const translateRc = require('./translate-rc'); 10 const translateRc = require('./translate-rc');
11 const messageExtractor = require('./message-extractor'); 11 const messageExtractor = require('./message-extractor');
12 const patternRules = require('./pattern-rules'); 12 const patternRules = require('./pattern-rules');
13 13
14 const priceRules = (
15 config.partner
16 && config.partner.price_rules
17 && Array.isArray(config.partner.price_rules)
18 && config.partner.price_rules.length
19 && config.partner.price_rules
20 .filter((rule) => rule.pattern && !rule.disable && !rule.disabled)
21 .map((rule) => ({
22 pattern: (typeof rule.pattern === 'string') ? new RegExp(rule.pattern) : rule.pattern,
23 idx: rule.idx,
24 disable: rule.disable || rule.disabled,
25 postprocessing: rule.postprocessing,
26 }))
27 ) || patternRules.price;
28
29 const balanceRules = (
30 config.partner
31 && config.partner.balance_rules
32 && Array.isArray(config.partner.balance_rules)
33 && config.partner.balance_rules.length
34 && config.partner.balance_rules
35 .filter((rule) => rule.pattern && !rule.disable && !rule.disabled)
36 .map((rule) => ({
37 pattern: (typeof rule.pattern === 'string') ? new RegExp(rule.pattern) : rule.pattern,
38 idx: rule.idx,
39 disable: rule.disable || rule.disabled,
40 postprocessing: rule.postprocessing,
41 }))
42 ) || patternRules.balance;
43
14 module.exports = (xid, trxIdFromCaller, xml, isCallback, remoteIp) => { 44 module.exports = (xid, trxIdFromCaller, xml, isCallback, remoteIp) => {
15 logger.verbose(`${MODULE_NAME} 58547863: Processing XML message`, { xid, isCallback }); 45 logger.verbose(`${MODULE_NAME} 58547863: Processing XML message`, { xid, isCallback });
16 46
17 const responseType = isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE'; 47 const responseType = isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE';
18 48
19 if (!trxIdFromCaller && !isCallback) { 49 if (!trxIdFromCaller && !isCallback) {
20 if (logger) logger.warn(`${MODULE_NAME} 8CAAD7C9: No trx id on non callback`, { xid }); 50 if (logger) logger.warn(`${MODULE_NAME} 8CAAD7C9: No trx id on non callback`, { xid });
21 return; 51 return;
22 } 52 }
23 53
24 const obj = parseXml(xid, xml); 54 const obj = parseXml(xid, xml);
25 if (!obj) { 55 if (!obj) {
26 const e = new Error(`${MODULE_NAME} B46CAAD1: Invalid XML`); 56 const e = new Error(`${MODULE_NAME} B46CAAD1: Invalid XML`);
27 logger.warn(e.message, { xid }); 57 logger.warn(e.message, { xid });
28 58
29 if (trxIdFromCaller) { 59 if (trxIdFromCaller) {
30 report(xid, { 60 report(xid, {
31 trx_id: trxIdFromCaller.toString(), 61 trx_id: trxIdFromCaller.toString(),
32 rc: '68', 62 rc: '68',
33 message: { 63 message: {
34 xid, 64 xid,
35 responseType, 65 responseType,
36 'GW-ERROR': { 66 'GW-ERROR': {
37 message: e.message, 67 message: e.message,
38 responseFromPartner: xml, 68 responseFromPartner: xml,
39 }, 69 },
40 }, 70 },
41 }); 71 });
42 } 72 }
43 73
44 return; 74 return;
45 } 75 }
46 76
47 const params = getParamsMemberObj(obj, false); 77 const params = getParamsMemberObj(obj, false);
48 78
49 if (!params) { 79 if (!params) {
50 const e = new Error(`${MODULE_NAME} A7B7EB30: Can not get params from message`); 80 const e = new Error(`${MODULE_NAME} A7B7EB30: Can not get params from message`);
51 logger.warn(e.message, { xid }); 81 logger.warn(e.message, { xid });
52 82
53 if (trxIdFromCaller) { 83 if (trxIdFromCaller) {
54 report(xid, { 84 report(xid, {
55 trx_id: trxIdFromCaller.toString(), 85 trx_id: trxIdFromCaller.toString(),
56 rc: '68', 86 rc: '68',
57 message: { 87 message: {
58 xid, 88 xid,
59 responseType, 89 responseType,
60 'GW-ERROR': { 90 'GW-ERROR': {
61 message: e.message, 91 message: e.message,
62 responseFromPartner: obj, 92 responseFromPartner: obj,
63 }, 93 },
64 }, 94 },
65 }); 95 });
66 } 96 }
67 } 97 }
68 98
69 logger.verbose(`${MODULE_NAME} 3D5400C1: Params extracted from response`, { xid, params }); 99 logger.verbose(`${MODULE_NAME} 3D5400C1: Params extracted from response`, { xid, params });
70 100
71 const requestIdField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.requestId) || 'REQUESTID'; 101 const requestIdField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.requestId) || 'REQUESTID';
72 const requestIdFromResponse = params[requestIdField]; 102 const requestIdFromResponse = params[requestIdField];
73 103
74 const responseCodeField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.responseCode) || 'RESPONSECODE'; 104 const responseCodeField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.responseCode) || 'RESPONSECODE';
75 const responseCodeFromResponse = params[responseCodeField]; 105 const responseCodeFromResponse = params[responseCodeField];
76 106
77 const messageField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.message) || 'MESSAGE'; 107 const messageField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.message) || 'MESSAGE';
78 const messageFromResponse = params[messageField]; 108 const messageFromResponse = params[messageField];
79 109
80 const snField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.sn) || 'SN'; 110 const snField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.sn) || 'SN';
81 const snFromResponse = params[snField]; 111 const snFromResponse = params[snField];
82 112
83 const trxId = trxIdFromCaller || requestIdFromResponse; 113 const trxId = trxIdFromCaller || requestIdFromResponse;
84 if (!trxId) { 114 if (!trxId) {
85 logger.warn(`${MODULE_NAME} 534E684A: Unknown trxId`, { xid }); 115 logger.warn(`${MODULE_NAME} 534E684A: Unknown trxId`, { xid });
86 return; 116 return;
87 } 117 }
88 118
89 const rc = responseCodeFromResponse 119 const rc = responseCodeFromResponse
90 ? translateRc(xid, responseCodeFromResponse) || '40' 120 ? translateRc(xid, responseCodeFromResponse) || '40'
91 : '68'; 121 : '68';
92 122
93 const sn = ( 123 const sn = (
94 rc === '00' && ( 124 rc === '00' && (
95 snFromResponse 125 snFromResponse
96 || messageExtractor(patternRules.sn, messageFromResponse) 126 || messageExtractor(patternRules.sn, messageFromResponse)
97 ) 127 )
98 ) || null; 128 ) || null;
99 129
100 const amount = Number( 130 const amount = Number(
101 messageExtractor( 131 messageExtractor(
102 config.partner.price_rules || patternRules.price, 132 priceRules,
103 messageFromResponse, 133 messageFromResponse,
104 ) || '', 134 ) || '',
105 ) || null; 135 ) || null;
106 136
107 const balance = Number( 137 const balance = Number(
108 messageExtractor( 138 messageExtractor(
109 config.partner.balance_rules || patternRules.balance, 139 balanceRules,
110 messageFromResponse, 140 messageFromResponse,
111 ) || '', 141 ) || '',
112 ) || null; 142 ) || null;
113 143
114 report(xid, { 144 report(xid, {
115 trx_id: trxId.toString(), 145 trx_id: trxId.toString(),
116 rc, 146 rc,
117 sn, 147 sn,
118 amount, 148 amount,
119 balance, 149 balance,
120 message: { 150 message: {
121 xid, 151 xid,
122 ip: remoteIp || null, 152 ip: remoteIp || null,
123 responseType: isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE', 153 responseType: isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE',
124 message: params, 154 message: params,
125 }, 155 },
126 }); 156 });
127 }; 157 };
128 158