Commit 15b9e672b358e957cc5aba5c1ab24835c8e204d9
1 parent
e62a7694fd
Exists in
master
Fix custom rules
Showing 1 changed file with 32 additions and 2 deletions Inline Diff
lib/parse-result.js
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 |