Commit 732c359a73db49f1ca33fbc55cb2fcc276daee91
1 parent
c6a2bf27de
Exists in
master
and in
1 other branch
Partner listener dumper
Showing 5 changed files with 107 additions and 11 deletions Inline Diff
lib/partner-listener/dumper/index.js
File was created | 1 | const MODULE_NAME = 'PARTNER-LISTENER.DUMPER'; | |
2 | |||
3 | const fsPromise = require('fs').promises; | ||
4 | const path = require('path'); | ||
5 | const moment = require('moment'); | ||
6 | const config = require('komodo-sdk/config'); | ||
7 | const logger = require('komodo-sdk/logger'); | ||
8 | |||
9 | const mkdirIfNotExists = require('../../utils/mkdir-if-not-exists'); | ||
10 | |||
11 | const baseDumpDir = path.join('dump', 'partner-listener'); | ||
12 | const lastDumpFileName = path.join(baseDumpDir, 'last'); | ||
13 | |||
14 | module.exports = async (xid, req, responseBody) => { | ||
15 | if ( | ||
16 | !config | ||
17 | || !config.listener | ||
18 | || !config.listener.partner | ||
19 | || !config.listener.partner.dump | ||
20 | ) return; | ||
21 | |||
22 | const data = `-------- | ||
23 | XID: ${xid} | ||
24 | TS: ${moment().format('YYYY-MM-DD HH:mm:ss')} | ||
25 | |||
26 | REQ FROM: ${req.ip} | ||
27 | REQ CONTENT-TYPE: ${req.get('content-type')} | ||
28 | REQ METHOD: ${req.method} | ||
29 | REQ URL: ${req.url} | ||
30 | |||
31 | REQ QUERY-STRING: | ||
32 | ${JSON.stringify(req.query, null, 2)} | ||
33 | |||
34 | REQ BODY: | ||
35 | ${typeof req.body === 'string' ? req.body : JSON.stringify(req.body, null, 2)} | ||
36 | |||
37 | RES BODY: | ||
38 | ${typeof responseBody === 'string' ? responseBody : JSON.stringify(responseBody, null, 2)} | ||
39 | `; | ||
40 | |||
41 | const dumpFileName = path.join( | ||
42 | baseDumpDir, | ||
43 | moment().format('YYYY-MM-DD'), | ||
44 | [ | ||
45 | moment().format('YYMMDD_HHmmss_SSS'), | ||
46 | xid, | ||
47 | ].join('_'), | ||
48 | ); | ||
49 | |||
50 | try { | ||
51 | await mkdirIfNotExists(xid, path.basename(dumpFileName)); | ||
52 | await fsPromise.writeFile(lastDumpFileName, data); | ||
53 | await fsPromise.writeFile(dumpFileName, data); | ||
54 | } catch (e) { | ||
55 | logger.warn(`${MODULE_NAME} FBC46420: Exception on dumping file`, { | ||
56 | xid, | ||
57 | eCode: e.code, | ||
58 | eMessage: e.eMessage, | ||
59 | }); | ||
60 | } | ||
61 | }; | ||
62 |
lib/partner-listener/routers/inquiry.js
1 | const axios = require('axios').default; | 1 | const axios = require('axios').default; |
2 | const express = require('express'); | 2 | const express = require('express'); |
3 | const coreUrl = require('komodo-sdk/core-url'); | 3 | const coreUrl = require('komodo-sdk/core-url'); |
4 | 4 | ||
5 | const config = require('komodo-sdk/config'); | 5 | const config = require('komodo-sdk/config'); |
6 | const logger = require('komodo-sdk/logger'); | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | ||
8 | const getFromBodyQsParams = require('../../get-from-body-qs-params'); | 8 | const getFromBodyQsParams = require('../../get-from-body-qs-params'); |
9 | const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); | 9 | const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); |
10 | const dumper = require('../dumper'); | ||
10 | 11 | ||
11 | const router = express.Router(); | 12 | const router = express.Router(); |
12 | module.exports = router; | 13 | module.exports = router; |
13 | 14 | ||
14 | const CORE_ENDPOINT = `${coreUrl}/postpaid2/inquiry`; | 15 | const CORE_ENDPOINT = `${coreUrl}/postpaid2/inquiry`; |
15 | 16 | ||
16 | const mainHandler = async (req, res) => { | 17 | const mainHandler = async (req, res) => { |
17 | const { xid } = res.locals; | 18 | const { xid } = res.locals; |
18 | 19 | ||
19 | const requestId = (getFromBodyQsParams(req, 'request_id') || '').toString().trim(); | 20 | const requestId = (getFromBodyQsParams(req, 'request_id') || '').toString().trim(); |
20 | const terminalNameWithoutIp = (getFromBodyQsParams(req, 'terminal_name') || '').toString().trim(); | 21 | const terminalNameWithoutIp = (getFromBodyQsParams(req, 'terminal_name') || '').toString().trim(); |
21 | const terminalName = `${terminalNameWithoutIp}@${ipv6ToIpv4(req.ip)}`; | 22 | const terminalName = `${terminalNameWithoutIp}@${ipv6ToIpv4(req.ip)}`; |
22 | const productName = (getFromBodyQsParams(req, 'product_name') || '').trim().toUpperCase(); | 23 | const productName = (getFromBodyQsParams(req, 'product_name') || '').trim().toUpperCase(); |
23 | const destination = (getFromBodyQsParams(req, 'destination') || '').toString().trim(); | 24 | const destination = (getFromBodyQsParams(req, 'destination') || '').toString().trim(); |
24 | const password = getFromBodyQsParams(req, 'password'); | 25 | const password = getFromBodyQsParams(req, 'password'); |
25 | const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); | 26 | const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); |
26 | 27 | ||
27 | if (!requestId || !terminalNameWithoutIp || !productName || !destination) { | 28 | if (!requestId || !terminalNameWithoutIp || !productName || !destination) { |
28 | res.end('INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'); | 29 | const msg = 'INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'; |
30 | res.end(msg); | ||
31 | |||
32 | dumper(xid, req, msg); | ||
29 | return; | 33 | return; |
30 | } | 34 | } |
31 | 35 | ||
32 | const params = { | 36 | const params = { |
33 | origin: config.name, | 37 | origin: config.name, |
34 | report_ip: config.listener.core.from_ip, | 38 | report_ip: config.listener.core.from_ip, |
35 | report_port: config.listener.core.port || 25614, | 39 | report_port: config.listener.core.port || 25614, |
36 | request_id: requestId, | 40 | request_id: requestId, |
37 | terminal_name: terminalName, | 41 | terminal_name: terminalName, |
38 | product_name: productName, | 42 | product_name: productName, |
39 | destination, | 43 | destination, |
40 | terminal_password: password, | 44 | terminal_password: password, |
41 | reverse_url: reverseUrl, | 45 | reverse_url: reverseUrl, |
42 | }; | 46 | }; |
43 | 47 | ||
44 | logger.info('Forwarding INQUIRY request to CORE', { xid, params }); | 48 | logger.info('Forwarding INQUIRY request to CORE', { xid, params }); |
45 | try { | 49 | try { |
46 | const result = await axios.get(CORE_ENDPOINT, { | 50 | const result = await axios.get(CORE_ENDPOINT, { |
47 | params, | 51 | params, |
48 | timeout: 10000, | 52 | timeout: 10000, |
49 | }); | 53 | }); |
50 | 54 | ||
51 | if (!result || !result.data) { | 55 | if (!result || !result.data) { |
52 | const newError = new Error('8002EB0D: Empty CORE INQUIRY direct-response'); | 56 | const newError = new Error('8002EB0D: Empty CORE INQUIRY direct-response'); |
53 | logger.warn(newError.message, { xid }); | 57 | logger.warn(newError.message, { xid }); |
54 | throw newError; | 58 | throw newError; |
55 | } | 59 | } |
56 | 60 | ||
57 | logger.verbose('Got INQUIRY direct-response from CORE', { | 61 | logger.verbose('Got INQUIRY direct-response from CORE', { |
58 | xid, | 62 | xid, |
59 | coreResponse: result.data, | 63 | coreResponse: result.data, |
60 | }); | 64 | }); |
61 | 65 | ||
62 | const resultForPartner = { | 66 | const resultForPartner = { |
63 | httpgetx_xid: xid, | 67 | httpgetx_xid: xid, |
64 | command: result.data.command, | 68 | command: result.data.command, |
65 | request_id: result.data.request_id && result.data.request_id.toString(), | 69 | request_id: result.data.request_id && result.data.request_id.toString(), |
66 | transaction_id: result.data.transaction_id && result.data.transaction_id.toString(), | 70 | transaction_id: result.data.transaction_id && result.data.transaction_id.toString(), |
67 | transaction_date: result.data.transaction_date, | 71 | transaction_date: result.data.transaction_date, |
68 | store_name: result.data.store_name, | 72 | store_name: result.data.store_name, |
69 | terminal_name: result.data.terminal_name, | 73 | terminal_name: result.data.terminal_name, |
70 | product_name: result.data.product_name, | 74 | product_name: result.data.product_name, |
71 | destination: result.data.destination, | 75 | destination: result.data.destination, |
72 | rc: result.data.rc, | 76 | rc: result.data.rc, |
73 | sn: result.data.sn, | 77 | sn: result.data.sn, |
74 | message: result.data.message, | 78 | message: result.data.message, |
75 | amount: result.data.amount, | 79 | amount: result.data.amount, |
76 | ending_balance: result.data.ending_balance, | 80 | ending_balance: result.data.ending_balance, |
77 | amount_to_charge: result.data.amount_to_charge, | 81 | amount_to_charge: result.data.amount_to_charge, |
78 | }; | 82 | }; |
79 | 83 | ||
80 | logger.verbose('Forwarding CORE direct-response to partner', { | 84 | logger.verbose('Forwarding CORE direct-response to partner', { |
81 | xid, | 85 | xid, |
82 | resultForPartner, | 86 | resultForPartner, |
83 | }); | 87 | }); |
84 | 88 | ||
85 | res.json(resultForPartner); | 89 | res.json(resultForPartner); |
90 | |||
91 | dumper(xid, req, resultForPartner); | ||
86 | } catch (e) { | 92 | } catch (e) { |
87 | logger.warn('EXCEPTION on forwarding INQUIRY request to CORE', { | 93 | logger.warn('EXCEPTION on forwarding INQUIRY request to CORE', { |
88 | xid, | 94 | xid, |
89 | errCode: e.code, | 95 | errCode: e.code, |
90 | errMessage: e.message, | 96 | errMessage: e.message, |
91 | }); | 97 | }); |
92 | 98 | ||
93 | res.json({ | 99 | const resultForPartner = { |
94 | httpgetx_xid: xid, | 100 | httpgetx_xid: xid, |
95 | command: 'INQUIRY', | 101 | command: 'INQUIRY', |
96 | request_id: requestId, | 102 | request_id: requestId, |
97 | terminal_name: terminalName, | 103 | terminal_name: terminalName, |
98 | product_name: productName, | 104 | product_name: productName, |
99 | destination, | 105 | destination, |
100 | rc: '68', | 106 | rc: '68', |
101 | message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', | 107 | message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', |
102 | }); | 108 | }; |
109 | |||
110 | res.json(resultForPartner); | ||
111 | dumper(xid, req, resultForPartner); | ||
103 | } | 112 | } |
104 | }; | 113 | }; |
105 | 114 | ||
106 | router.all('/', mainHandler); | 115 | router.all('/', mainHandler); |
107 | 116 |
lib/partner-listener/routers/pay.js
1 | const axios = require('axios').default; | 1 | const axios = require('axios').default; |
2 | const express = require('express'); | 2 | const express = require('express'); |
3 | const coreUrl = require('komodo-sdk/core-url'); | 3 | const coreUrl = require('komodo-sdk/core-url'); |
4 | 4 | ||
5 | const config = require('komodo-sdk/config'); | 5 | const config = require('komodo-sdk/config'); |
6 | const logger = require('komodo-sdk/logger'); | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | ||
8 | const getFromBodyQsParams = require('../../get-from-body-qs-params'); | 8 | const getFromBodyQsParams = require('../../get-from-body-qs-params'); |
9 | const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); | 9 | const ipv6ToIpv4 = require('../../ipv6-to-ipv4'); |
10 | const dumper = require('../dumper'); | ||
10 | 11 | ||
11 | const router = express.Router(); | 12 | const router = express.Router(); |
12 | module.exports = router; | 13 | module.exports = router; |
13 | 14 | ||
14 | const CORE_ENDPOINT = `${coreUrl}/postpaid2/pay`; | 15 | const CORE_ENDPOINT = `${coreUrl}/postpaid2/pay`; |
15 | 16 | ||
16 | const mainHandler = async (req, res) => { | 17 | const mainHandler = async (req, res) => { |
17 | const { xid } = res.locals; | 18 | const { xid } = res.locals; |
18 | 19 | ||
19 | const requestId = (getFromBodyQsParams(req, 'request_id') || '').toString().trim(); | 20 | const requestId = (getFromBodyQsParams(req, 'request_id') || '').toString().trim(); |
20 | const terminalNameWithoutIp = (getFromBodyQsParams(req, 'terminal_name') || '').toString().trim(); | 21 | const terminalNameWithoutIp = (getFromBodyQsParams(req, 'terminal_name') || '').toString().trim(); |
21 | const terminalName = `${terminalNameWithoutIp}@${ipv6ToIpv4(req.ip)}`; | 22 | const terminalName = `${terminalNameWithoutIp}@${ipv6ToIpv4(req.ip)}`; |
22 | const productName = (getFromBodyQsParams(req, 'product_name') || '').trim().toUpperCase(); | 23 | const productName = (getFromBodyQsParams(req, 'product_name') || '').trim().toUpperCase(); |
23 | const destination = (getFromBodyQsParams(req, 'destination') || '').toString().trim(); | 24 | const destination = (getFromBodyQsParams(req, 'destination') || '').toString().trim(); |
24 | const password = getFromBodyQsParams(req, 'password'); | 25 | const password = getFromBodyQsParams(req, 'password'); |
25 | const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); | 26 | const reverseUrl = getFromBodyQsParams(req, 'reverse_url'); |
26 | 27 | ||
27 | if (!requestId || !terminalNameWithoutIp || !productName || !destination) { | 28 | if (!requestId || !terminalNameWithoutIp || !productName || !destination) { |
28 | res.end('INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'); | 29 | const msg = 'INVALID REQUEST. Missing request_id or terminal_name or product_name or destination.'; |
30 | res.end(msg); | ||
31 | dumper(xid, req, msg); | ||
29 | return; | 32 | return; |
30 | } | 33 | } |
31 | 34 | ||
32 | const params = { | 35 | const params = { |
33 | origin: config.name, | 36 | origin: config.name, |
34 | report_ip: config.listener.core.from_ip, | 37 | report_ip: config.listener.core.from_ip, |
35 | report_port: config.listener.core.port || 25614, | 38 | report_port: config.listener.core.port || 25614, |
36 | request_id: requestId, | 39 | request_id: requestId, |
37 | terminal_name: terminalName, | 40 | terminal_name: terminalName, |
38 | product_name: productName, | 41 | product_name: productName, |
39 | destination, | 42 | destination, |
40 | terminal_password: password, | 43 | terminal_password: password, |
41 | reverse_url: reverseUrl, | 44 | reverse_url: reverseUrl, |
42 | }; | 45 | }; |
43 | 46 | ||
44 | logger.info('Forwarding PAY request to CORE', { xid, params }); | 47 | logger.info('Forwarding PAY request to CORE', { xid, params }); |
45 | try { | 48 | try { |
46 | const result = await axios.get(CORE_ENDPOINT, { | 49 | const result = await axios.get(CORE_ENDPOINT, { |
47 | params, | 50 | params, |
48 | timeout: 10000, | 51 | timeout: 10000, |
49 | }); | 52 | }); |
50 | 53 | ||
51 | if (!result || !result.data) { | 54 | if (!result || !result.data) { |
52 | const newError = new Error('0D428E4C: Empty CORE PAY direct-response'); | 55 | const newError = new Error('0D428E4C: Empty CORE PAY direct-response'); |
53 | logger.warn(newError.message, { xid }); | 56 | logger.warn(newError.message, { xid }); |
54 | throw newError; | 57 | throw newError; |
55 | } | 58 | } |
56 | 59 | ||
57 | logger.verbose('Got PAY direct-response from CORE', { | 60 | logger.verbose('Got PAY direct-response from CORE', { |
58 | xid, | 61 | xid, |
59 | coreResponse: result.data, | 62 | coreResponse: result.data, |
60 | }); | 63 | }); |
61 | 64 | ||
62 | const resultForPartner = { | 65 | const resultForPartner = { |
63 | httpgetx_xid: xid, | 66 | httpgetx_xid: xid, |
64 | command: result.data.command, | 67 | command: result.data.command, |
65 | request_id: result.data.request_id && result.data.request_id.toString(), | 68 | request_id: result.data.request_id && result.data.request_id.toString(), |
66 | transaction_id: result.data.transaction_id && result.data.transaction_id.toString(), | 69 | transaction_id: result.data.transaction_id && result.data.transaction_id.toString(), |
67 | transaction_date: result.data.transaction_date, | 70 | transaction_date: result.data.transaction_date, |
68 | store_name: result.data.store_name, | 71 | store_name: result.data.store_name, |
69 | terminal_name: result.data.terminal_name, | 72 | terminal_name: result.data.terminal_name, |
70 | product_name: result.data.product_name, | 73 | product_name: result.data.product_name, |
71 | destination: result.data.destination, | 74 | destination: result.data.destination, |
72 | rc: result.data.rc, | 75 | rc: result.data.rc, |
73 | sn: result.data.sn, | 76 | sn: result.data.sn, |
74 | message: result.data.message, | 77 | message: result.data.message, |
75 | amount: result.data.amount, | 78 | amount: result.data.amount, |
76 | ending_balance: result.data.ending_balance, | 79 | ending_balance: result.data.ending_balance, |
77 | }; | 80 | }; |
78 | 81 | ||
79 | logger.verbose('Forwarding CORE PAY direct-response to partner', { | 82 | logger.verbose('Forwarding CORE PAY direct-response to partner', { |
80 | xid, | 83 | xid, |
81 | resultForPartner, | 84 | resultForPartner, |
82 | }); | 85 | }); |
83 | 86 | ||
84 | res.json(resultForPartner); | 87 | res.json(resultForPartner); |
88 | dumper(xid, req, resultForPartner); | ||
85 | } catch (e) { | 89 | } catch (e) { |
86 | logger.warn('EXCEPTION on forwarding PAY request to CORE', { | 90 | logger.warn('EXCEPTION on forwarding PAY request to CORE', { |
87 | xid, | 91 | xid, |
88 | errCode: e.code, | 92 | errCode: e.code, |
89 | errMessage: e.message, | 93 | errMessage: e.message, |
90 | }); | 94 | }); |
91 | 95 | ||
92 | res.json({ | 96 | const resultForPartner = { |
93 | httpgetx_xid: xid, | 97 | httpgetx_xid: xid, |
94 | command: 'PAY', | 98 | command: 'PAY', |
95 | request_id: requestId, | 99 | request_id: requestId, |
96 | terminal_name: terminalName, | 100 | terminal_name: terminalName, |
97 | product_name: productName, | 101 | product_name: productName, |
98 | destination, | 102 | destination, |
99 | rc: '68', | 103 | rc: '68', |
100 | message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', | 104 | message: 'CORE tidak merespon dengan benar, tidak dapat mengetahui status request anda', |
101 | }); | 105 | }; |
106 | |||
107 | dumper(xid, req, resultForPartner); | ||
102 | } | 108 | } |
103 | }; | 109 | }; |
104 | 110 | ||
105 | router.all('/', mainHandler); | 111 | router.all('/', mainHandler); |
106 | 112 |
lib/partner-listener/routers/topup.js
1 | const MODULE_NAME = 'PARTNER-LISTENER.ROUTER.TOPUP'; | 1 | const MODULE_NAME = 'PARTNER-LISTENER.ROUTER.TOPUP'; |
2 | 2 | ||
3 | const express = require('express'); | 3 | const express = require('express'); |
4 | 4 | ||
5 | const config = require('komodo-sdk/config'); | 5 | const config = require('komodo-sdk/config'); |
6 | const logger = require('komodo-sdk/logger'); | 6 | const logger = require('komodo-sdk/logger'); |
7 | const coreapi = require('komodo-sdk/coreapi'); | 7 | const coreapi = require('komodo-sdk/coreapi'); |
8 | // const coreapi = require('../../coreapi'); | 8 | // const coreapi = require('../../coreapi'); |
9 | const matrix = require('../../matrix'); | 9 | const matrix = require('../../matrix'); |
10 | const dumper = require('../dumper'); | ||
10 | 11 | ||
11 | const router = express.Router(); | 12 | const router = express.Router(); |
12 | module.exports = router; | 13 | module.exports = router; |
13 | 14 | ||
14 | function onInvalidParameter(missingParameter, req, res) { | 15 | function onInvalidParameter(missingParameter, req, res) { |
15 | logger.verbose(`${MODULE_NAME} 1536D577: Undefined ${missingParameter} parameter`, { | 16 | logger.verbose(`${MODULE_NAME} 1536D577: Undefined ${missingParameter} parameter`, { |
16 | xid: res.locals.xid, | 17 | xid: res.locals.xid, |
17 | ip: req.ip, | 18 | ip: req.ip, |
18 | terminal_name: req.body.terminal_name || req.query.terminal_name, | 19 | terminal_name: req.body.terminal_name || req.query.terminal_name, |
19 | request_id: req.body.request_id || req.query.request_id, | 20 | request_id: req.body.request_id || req.query.request_id, |
20 | product_name: req.body.product_name || req.query.product_name, | 21 | product_name: req.body.product_name || req.query.product_name, |
21 | destination: req.body.destination || req.query.destination, | 22 | destination: req.body.destination || req.query.destination, |
22 | }); | 23 | }); |
23 | res.end('INVALID REQUEST'); | 24 | res.end('INVALID REQUEST'); |
24 | } | 25 | } |
25 | 26 | ||
26 | function pagePrerequisite(req, res, next) { | 27 | function pagePrerequisite(req, res, next) { |
27 | if (!req.body) req.body = {}; | 28 | if (!req.body) req.body = {}; |
28 | 29 | ||
29 | if (!req.body.terminal_name && !req.query.terminal_name) { | 30 | if (!req.body.terminal_name && !req.query.terminal_name) { |
30 | onInvalidParameter('terminal_name', req, res); | 31 | onInvalidParameter('terminal_name', req, res); |
31 | return; | 32 | return; |
32 | } | 33 | } |
33 | 34 | ||
34 | if (!req.body.password && !req.query.password) { | 35 | if (!req.body.password && !req.query.password) { |
35 | onInvalidParameter('password', req, res); | 36 | onInvalidParameter('password', req, res); |
36 | return; | 37 | return; |
37 | } | 38 | } |
38 | 39 | ||
39 | if (!req.body.request_id && !req.query.request_id) { | 40 | if (!req.body.request_id && !req.query.request_id) { |
40 | onInvalidParameter('request_id', req, res); | 41 | onInvalidParameter('request_id', req, res); |
41 | return; | 42 | return; |
42 | } | 43 | } |
43 | 44 | ||
44 | if (!req.body.product_name && !req.query.product_name) { | 45 | if (!req.body.product_name && !req.query.product_name) { |
45 | onInvalidParameter('product_name', req, res); | 46 | onInvalidParameter('product_name', req, res); |
46 | return; | 47 | return; |
47 | } | 48 | } |
48 | 49 | ||
49 | if (!req.body.destination && !req.query.destination) { | 50 | if (!req.body.destination && !req.query.destination) { |
50 | onInvalidParameter('destination', req, res); | 51 | onInvalidParameter('destination', req, res); |
51 | return; | 52 | return; |
52 | } | 53 | } |
53 | 54 | ||
54 | next(); | 55 | next(); |
55 | } | 56 | } |
56 | 57 | ||
57 | async function pageIndex(req, res) { | 58 | async function pageIndex(req, res) { |
58 | const { xid } = res.locals; | 59 | const { xid } = res.locals; |
59 | 60 | ||
60 | const terminalName = `${req.body.terminal_name || req.query.terminal_name}@${req.ip.replace(/^::ffff:/, '')}`; | 61 | const terminalName = `${req.body.terminal_name || req.query.terminal_name}@${req.ip.replace(/^::ffff:/, '')}`; |
61 | 62 | ||
62 | matrix.core.sent += 1; | 63 | matrix.core.sent += 1; |
63 | 64 | ||
64 | const [err, coreResponse] = await coreapi({ | 65 | const [err, coreResponse] = await coreapi({ |
65 | xid, | 66 | xid, |
66 | path: '/prepaid/buy', | 67 | path: '/prepaid/buy', |
67 | qs: { | 68 | qs: { |
68 | terminal_name: terminalName, | 69 | terminal_name: terminalName, |
69 | password: req.body.password || req.query.password, | 70 | password: req.body.password || req.query.password, |
70 | request_id: req.body.request_id || req.query.request_id, | 71 | request_id: req.body.request_id || req.query.request_id, |
71 | product_name: req.body.product_name || req.query.product_name, | 72 | product_name: req.body.product_name || req.query.product_name, |
72 | destination: req.body.destination || req.query.destination, | 73 | destination: req.body.destination || req.query.destination, |
73 | origin: config.name || 'HTTPGETX', | 74 | origin: config.name || 'HTTPGETX', |
74 | report_ip: config.listener.core.ip || null, | 75 | report_ip: config.listener.core.ip || null, |
75 | report_port: config.listener.core.port, | 76 | report_port: config.listener.core.port, |
76 | reverse_url: req.body.reverse_url || req.query.reverse_url || null, | 77 | reverse_url: req.body.reverse_url || req.query.reverse_url || null, |
77 | }, | 78 | }, |
78 | }); | 79 | }); |
79 | 80 | ||
80 | if (err || !coreResponse) { | 81 | if (err || !coreResponse) { |
81 | matrix.core.sent_failed += 1; | 82 | matrix.core.sent_failed += 1; |
82 | matrix.core.last_error = { | 83 | matrix.core.last_error = { |
83 | xid, | 84 | xid, |
84 | ts: new Date(), | 85 | ts: new Date(), |
85 | e: err, | 86 | e: err, |
86 | eCode: err.code, | 87 | eCode: err.code, |
87 | eMessage: err.message, | 88 | eMessage: err.message, |
88 | }; | 89 | }; |
89 | 90 | ||
90 | logger.warn(`${MODULE_NAME} 8DEBE15F: ERROR on /prepaid/buy response`, { | 91 | logger.warn(`${MODULE_NAME} 8DEBE15F: ERROR on /prepaid/buy response`, { |
91 | xid, | 92 | xid, |
92 | err, | 93 | err, |
93 | coreResponseTypeof: typeof coreResponse, | 94 | coreResponseTypeof: typeof coreResponse, |
94 | coreResponse, | 95 | coreResponse, |
95 | }); | 96 | }); |
96 | res.end('INVALID CORE RESPONSE'); | 97 | res.end('INVALID CORE RESPONSE'); |
98 | |||
99 | dumper(xid, req, 'INVALID CORE RESPONSE'); | ||
97 | return; | 100 | return; |
98 | } | 101 | } |
99 | 102 | ||
100 | logger.verbose(`${MODULE_NAME} 2528A9B4: Got CORE response`, { | 103 | logger.verbose(`${MODULE_NAME} 2528A9B4: Got CORE response`, { |
101 | xid, | 104 | xid, |
102 | coreResponse, | 105 | coreResponse, |
103 | }); | 106 | }); |
104 | 107 | ||
105 | const responseToPartner = { | 108 | const responseToPartner = { |
106 | httpgetx_xid: xid, | 109 | httpgetx_xid: xid, |
107 | request_id: coreResponse.request_id, | 110 | request_id: coreResponse.request_id, |
108 | transaction_id: coreResponse.transaction_id, | 111 | transaction_id: coreResponse.transaction_id, |
109 | transaction_date: coreResponse.transaction_date, | 112 | transaction_date: coreResponse.transaction_date, |
110 | store_name: coreResponse.store_name, | 113 | store_name: coreResponse.store_name, |
111 | terminal_name: coreResponse.terminal_name, | 114 | terminal_name: coreResponse.terminal_name, |
112 | product_name: coreResponse.product_name, | 115 | product_name: coreResponse.product_name, |
113 | destination: coreResponse.destination, | 116 | destination: coreResponse.destination, |
114 | rc: coreResponse.rc, | 117 | rc: coreResponse.rc, |
115 | sn: coreResponse.sn || undefined, | 118 | sn: coreResponse.sn || undefined, |
116 | amount: Number(coreResponse.amount) || undefined, | 119 | amount: Number(coreResponse.amount) || undefined, |
117 | ending_balance: Number(coreResponse.ending_balance) || undefined, | 120 | ending_balance: Number(coreResponse.ending_balance) || undefined, |
118 | message: coreResponse.message, | 121 | message: coreResponse.message, |
119 | }; | 122 | }; |
120 | 123 | ||
121 | res.json(responseToPartner); | 124 | res.json(responseToPartner); |
125 | dumper(xid, req, responseToPartner); | ||
122 | } | 126 | } |
123 | 127 | ||
124 | // router.all('/', (req, res) => { res.status(404).end('404: Not implemented yet'); }); | 128 | // router.all('/', (req, res) => { res.status(404).end('404: Not implemented yet'); }); |
125 | router.get('/', pagePrerequisite, pageIndex); | 129 | router.get('/', pagePrerequisite, pageIndex); |
126 | 130 |
lib/partner-listener/routers/trx-status.js
1 | const MODULE_NAME = 'PARTNER-LISTENER.ROUTERS.TRX-STATUS'; | 1 | const MODULE_NAME = 'PARTNER-LISTENER.ROUTERS.TRX-STATUS'; |
2 | 2 | ||
3 | const express = require('express'); | 3 | const express = require('express'); |
4 | const moment = require('moment'); | 4 | const moment = require('moment'); |
5 | 5 | ||
6 | const logger = require('komodo-sdk/logger'); | 6 | const logger = require('komodo-sdk/logger'); |
7 | 7 | ||
8 | const coreapi = require('../../coreapi'); | 8 | const coreapi = require('../../coreapi'); |
9 | const dumper = require('../dumper'); | ||
9 | 10 | ||
10 | const router = express.Router(); | 11 | const router = express.Router(); |
11 | module.exports = router; | 12 | module.exports = router; |
12 | 13 | ||
13 | async function pageIndex(req, res) { | 14 | async function pageIndex(req, res) { |
14 | const { xid } = res.locals; | 15 | const { xid } = res.locals; |
15 | if (!req.body) req.body = {}; | 16 | if (!req.body) req.body = {}; |
16 | 17 | ||
17 | if (!req.body.terminal_name && !req.query.terminal_name) { | 18 | if (!req.body.terminal_name && !req.query.terminal_name) { |
19 | const msg = 'Parameter terminal_name tidak terdefinisi'; | ||
18 | res.json({ | 20 | res.json({ |
19 | httpgetx_xid: xid, | 21 | httpgetx_xid: xid, |
20 | error: true, | 22 | error: true, |
21 | message: 'Parameter terminal_name tidak terdefinisi', | 23 | message: msg, |
22 | }); | 24 | }); |
25 | |||
26 | dumper(xid, req, msg); | ||
23 | return; | 27 | return; |
24 | } | 28 | } |
25 | 29 | ||
26 | if (!req.body.password && !req.query.password) { | 30 | if (!req.body.password && !req.query.password) { |
31 | const msg = 'Parameter password tidak terdefinisi'; | ||
27 | res.json({ | 32 | res.json({ |
28 | httpgetx_xid: xid, | 33 | httpgetx_xid: xid, |
29 | error: true, | 34 | error: true, |
30 | message: 'Parameter password tidak terdefinisi', | 35 | message: msg, |
31 | }); | 36 | }); |
37 | |||
38 | dumper(xid, req, msg); | ||
32 | return; | 39 | return; |
33 | } | 40 | } |
34 | 41 | ||
35 | if (!req.body.request_id && !req.query.request_id) { | 42 | if (!req.body.request_id && !req.query.request_id) { |
43 | const msg = 'Parameter request_id tidak terdefinisi'; | ||
36 | res.json({ | 44 | res.json({ |
37 | httpgetx_xid: xid, | 45 | httpgetx_xid: xid, |
38 | error: true, | 46 | error: true, |
39 | message: 'Parameter request_id tidak terdefinisi', | 47 | message: msg, |
40 | }); | 48 | }); |
49 | |||
50 | dumper(xid, req, msg); | ||
41 | return; | 51 | return; |
42 | } | 52 | } |
43 | 53 | ||
44 | const remoteIp = req.ip.replace(/^::ffff:/, ''); | 54 | const remoteIp = req.ip.replace(/^::ffff:/, ''); |
45 | const askerTerminalName = `${req.body.terminal_name || req.query.terminal_name}@${remoteIp}`; | 55 | const askerTerminalName = `${req.body.terminal_name || req.query.terminal_name}@${remoteIp}`; |
46 | 56 | ||
47 | const coreResponse = await coreapi({ | 57 | const coreResponse = await coreapi({ |
48 | xid, | 58 | xid, |
49 | path: '/trx-status/view', | 59 | path: '/trx-status/view', |
50 | qs: { | 60 | qs: { |
51 | asker_terminal_name: askerTerminalName, | 61 | asker_terminal_name: askerTerminalName, |
52 | asker_terminal_password: req.body.password || req.query.password, | 62 | asker_terminal_password: req.body.password || req.query.password, |
53 | request_id: req.body.request_id || req.query.request_id, | 63 | request_id: req.body.request_id || req.query.request_id, |
54 | }, | 64 | }, |
55 | }); | 65 | }); |
56 | 66 | ||
57 | if (!coreResponse || !coreResponse.status) { | 67 | if (!coreResponse || !coreResponse.status) { |
58 | const msg = 'Status transaksi tidak dapat diketahui karena suatu kesalahan pada sistem'; | 68 | const msg = 'Status transaksi tidak dapat diketahui karena suatu kesalahan pada sistem'; |
59 | 69 | ||
60 | logger.warn(`${MODULE_NAME} 9983DB34: ${msg}`, { | 70 | logger.warn(`${MODULE_NAME} 9983DB34: ${msg}`, { |
61 | xid, | 71 | xid, |
62 | ip: req.ip, | 72 | ip: req.ip, |
63 | terminal_name: req.body.terminal_name || req.query.terminal_name, | 73 | terminal_name: req.body.terminal_name || req.query.terminal_name, |
64 | request_id: req.body.request_id || req.query.request_id, | 74 | request_id: req.body.request_id || req.query.request_id, |
65 | }); | 75 | }); |
66 | 76 | ||
67 | res.json({ | 77 | const responseBody = { |
68 | httpgetx_xid: xid, | 78 | httpgetx_xid: xid, |
69 | error: true, | 79 | error: true, |
70 | from_ip: remoteIp, | 80 | from_ip: remoteIp, |
71 | terminal_name: req.body.terminal_name || req.query.terminal_name, | 81 | terminal_name: req.body.terminal_name || req.query.terminal_name, |
72 | full_terminal_name: askerTerminalName, | 82 | full_terminal_name: askerTerminalName, |
73 | password: req.body.password || req.query.password, | 83 | password: req.body.password || req.query.password, |
74 | message: msg, | 84 | message: msg, |
75 | }); | 85 | }; |
86 | |||
87 | res.json(responseBody); | ||
88 | dumper(xid, req, responseBody); | ||
89 | |||
76 | return; | 90 | return; |
77 | } | 91 | } |
78 | 92 | ||
79 | const trx = coreResponse && coreResponse.result ? { | 93 | const trx = coreResponse && coreResponse.result ? { |
80 | id: coreResponse.result.id, | 94 | id: coreResponse.result.id, |
81 | request_id: coreResponse.result.request_id, | 95 | request_id: coreResponse.result.request_id, |
82 | store_id: coreResponse.result.store_id, | 96 | store_id: coreResponse.result.store_id, |
83 | store_name: coreResponse.result.store_name, | 97 | store_name: coreResponse.result.store_name, |
84 | terminal_id: coreResponse.result.terminal_id, | 98 | terminal_id: coreResponse.result.terminal_id, |
85 | terminal_name: coreResponse.result.terminal_name, | 99 | terminal_name: coreResponse.result.terminal_name, |
86 | 100 | ||
87 | created: moment(coreResponse.result.created).format('YYYY-MM-DD HH:mm:ss'), | 101 | created: moment(coreResponse.result.created).format('YYYY-MM-DD HH:mm:ss'), |
88 | modified: moment(coreResponse.result.modified).format('YYYY-MM-DD HH:mm:ss'), | 102 | modified: moment(coreResponse.result.modified).format('YYYY-MM-DD HH:mm:ss'), |
89 | 103 | ||
90 | product_name: coreResponse.result.product_name, | 104 | product_name: coreResponse.result.product_name, |
91 | destination: coreResponse.result.destination, | 105 | destination: coreResponse.result.destination, |
92 | amount: coreResponse.result.amount, | 106 | amount: coreResponse.result.amount, |
93 | ending_balance: coreResponse.result.ending_balance, | 107 | ending_balance: coreResponse.result.ending_balance, |
94 | rc: coreResponse.result.rc, | 108 | rc: coreResponse.result.rc, |
95 | message: coreResponse.result.reply_message, | 109 | message: coreResponse.result.reply_message, |
96 | sn: coreResponse.result.sn, | 110 | sn: coreResponse.result.sn, |
97 | } | 111 | } |
98 | : null; | 112 | : null; |
99 | 113 | ||
100 | const result = { | 114 | const result = { |
101 | httpgetx_xid: xid, | 115 | httpgetx_xid: xid, |
102 | error: coreResponse.status !== 'OK', | 116 | error: coreResponse.status !== 'OK', |
103 | from_ip: remoteIp, | 117 | from_ip: remoteIp, |
104 | terminal_name: req.body.terminal_name || req.query.terminal_name, | 118 | terminal_name: req.body.terminal_name || req.query.terminal_name, |
105 | full_terminal_name: askerTerminalName, | 119 | full_terminal_name: askerTerminalName, |
106 | message: coreResponse.message, | 120 | message: coreResponse.message, |
107 | trx_found: !!trx, | 121 | trx_found: !!trx, |
108 | trx, | 122 | trx, |
109 | // original_trx: coreResponse.result, | 123 | // original_trx: coreResponse.result, |
110 | }; | 124 | }; |
111 | 125 | ||
112 | res.json(result); | 126 | res.json(result); |
113 | 127 | ||
114 | logger.info(`${MODULE_NAME} 480C4BB0: Partner request responded`, { | 128 | logger.info(`${MODULE_NAME} 480C4BB0: Partner request responded`, { |
115 | xid, | 129 | xid, |
116 | processing_time_in_ms: new Date() - res.locals.x_http_request_ts, | 130 | processing_time_in_ms: new Date() - res.locals.x_http_request_ts, |
117 | result, | 131 | result, |
118 | }); | 132 | }); |
133 | |||
134 | dumper(xid, req, result); | ||
119 | } | 135 | } |
120 | 136 | ||
121 | router.get('/', pageIndex); | 137 | router.get('/', pageIndex); |
122 | 138 |