Blame view
lib/partner-listener/routers/topup.js
5.49 KB
9e61d939f
|
1 |
const MODULE_NAME = 'PARTNER-LISTENER.ROUTER.TOPUP'; |
f2c18879a
|
2 |
const express = require('express'); |
ae566890d
|
3 |
const axios = require('axios'); |
f2c18879a
|
4 5 |
const config = require('komodo-sdk/config'); |
810fa18da
|
6 |
const logger = require('tektrans-logger'); |
f2c18879a
|
7 8 |
const coreapi = require('komodo-sdk/coreapi'); // const coreapi = require('../../coreapi'); |
cd4feda87
|
9 |
const matrix = require('../../matrix'); |
732c359a7
|
10 |
const dumper = require('../dumper'); |
f2c18879a
|
11 12 13 |
const router = express.Router(); module.exports = router; |
f2be872ef
|
14 15 16 17 18 |
const terminalsWithLocation = Array.isArray(config.terminals_with_location) ? config.terminals_with_location .filter((item) => typeof item === 'string') .map((item) => (item.trim().toLowerCase())) : []; |
f2c18879a
|
19 |
function onInvalidParameter(missingParameter, req, res) { |
9e61d939f
|
20 |
logger.verbose(`${MODULE_NAME} 1536D577: Undefined ${missingParameter} parameter`, { |
f2c18879a
|
21 22 23 24 25 26 27 28 29 30 31 32 |
xid: res.locals.xid, ip: req.ip, terminal_name: req.body.terminal_name || req.query.terminal_name, request_id: req.body.request_id || req.query.request_id, product_name: req.body.product_name || req.query.product_name, destination: req.body.destination || req.query.destination, }); res.end('INVALID REQUEST'); } function pagePrerequisite(req, res, next) { if (!req.body) req.body = {}; |
d7eb80819
|
33 34 |
const terminalName = req.body.terminal_name || req.query.terminal_name; if (!terminalName || typeof terminalName !== 'string') { |
f2c18879a
|
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
onInvalidParameter('terminal_name', req, res); return; } if (!req.body.password && !req.query.password) { onInvalidParameter('password', req, res); return; } if (!req.body.request_id && !req.query.request_id) { onInvalidParameter('request_id', req, res); return; } if (!req.body.product_name && !req.query.product_name) { onInvalidParameter('product_name', req, res); return; } if (!req.body.destination && !req.query.destination) { onInvalidParameter('destination', req, res); return; } next(); } async function pageIndex(req, res) { |
9e61d939f
|
63 |
const { xid } = res.locals; |
f485865e4
|
64 65 |
const terminalNameWithoutIp = ((req.body.terminal_name || req.query.terminal_name) || '').trim(); const terminalName = `${terminalNameWithoutIp}@${req.ip.replace(/^::ffff:/, '')}`; |
f2c18879a
|
66 |
|
f2be872ef
|
67 68 69 70 71 72 73 74 75 76 77 |
const qs = { terminal_name: terminalName, password: req.body.password || req.query.password, request_id: req.body.request_id || req.query.request_id, product_name: req.body.product_name || req.query.product_name, destination: req.body.destination || req.query.destination, origin: config.name || 'HTTPGETX', report_ip: config.listener.core.ip || null, report_port: config.listener.core.port, reverse_url: req.body.reverse_url || req.query.reverse_url || null, }; |
f485865e4
|
78 |
if (terminalsWithLocation.indexOf(terminalNameWithoutIp.toLowerCase()) >= 0) { |
f2be872ef
|
79 80 81 82 83 84 |
const location = req.body.location || req.body.location_id || req.query.location || req.query.location_id; if (location) { |
0ce2484a6
|
85 86 87 88 89 |
logger.verbose(`${MODULE_NAME} 5C41FBFA: Including location from partner request`, { xid, terminalName, location, }); |
f2be872ef
|
90 91 92 |
qs.location = location; } } |
b403448ad
|
93 |
matrix.core.sent += 1; |
cd4feda87
|
94 |
|
f2c18879a
|
95 |
const [err, coreResponse] = await coreapi({ |
9e61d939f
|
96 |
xid, |
f2c18879a
|
97 |
path: '/prepaid/buy', |
f2be872ef
|
98 |
qs, |
f2c18879a
|
99 |
}); |
bdbbbf27d
|
100 |
if (err || !coreResponse) { |
b403448ad
|
101 102 103 104 105 106 107 108 |
matrix.core.sent_failed += 1; matrix.core.last_error = { xid, ts: new Date(), e: err, eCode: err.code, eMessage: err.message, }; |
9e61d939f
|
109 110 111 112 113 |
logger.warn(`${MODULE_NAME} 8DEBE15F: ERROR on /prepaid/buy response`, { xid, err, coreResponseTypeof: typeof coreResponse, coreResponse, |
f2c18879a
|
114 115 |
}); res.end('INVALID CORE RESPONSE'); |
732c359a7
|
116 117 |
dumper(xid, req, 'INVALID CORE RESPONSE'); |
f2c18879a
|
118 119 |
return; } |
9e61d939f
|
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
logger.verbose(`${MODULE_NAME} 2528A9B4: Got CORE response`, { xid, coreResponse, }); const responseToPartner = { httpgetx_xid: xid, request_id: coreResponse.request_id, transaction_id: coreResponse.transaction_id, transaction_date: coreResponse.transaction_date, store_name: coreResponse.store_name, terminal_name: coreResponse.terminal_name, product_name: coreResponse.product_name, destination: coreResponse.destination, rc: coreResponse.rc, |
050d92ffb
|
135 |
sn: coreResponse.sn || undefined, |
70df828c5
|
136 137 |
amount: Number(coreResponse.amount) || undefined, ending_balance: Number(coreResponse.ending_balance) || undefined, |
9e61d939f
|
138 139 140 141 |
message: coreResponse.message, }; res.json(responseToPartner); |
ae566890d
|
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
if (config.listener.partner.webhook) { try { axios.post(config.listener.partner.webhook, { webhookType: 'KOMODO-CENTER-HTTPGETX.PARTNER-LISTENER.DIRECT-RESPONSE', body: responseToPartner, }); } catch (e) { logger.warn(`${MODULE_NAME} ECC37ECA: Exception on calling webhook`, { xid, eCode: e.code, eMessage: e.message || e.toString(), }); } } |
732c359a7
|
157 |
dumper(xid, req, responseToPartner); |
f2c18879a
|
158 |
} |
65f444c36
|
159 |
// router.all('/', (req, res) => { res.status(404).end('404: Not implemented yet'); }); |
f2c18879a
|
160 |
router.get('/', pagePrerequisite, pageIndex); |
16f7750ad
|
161 |
router.post('/', express.urlencoded({ extended: true }), express.json({ extended: true }), pageIndex); |