Commit 732c359a73db49f1ca33fbc55cb2fcc276daee91

Authored by Adhidarma Hadiwinoto
1 parent c6a2bf27de
Exists in master and in 1 other branch dev

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