Compare View
Commits (2)
Changes
Showing 3 changed files Side-by-side Diff
center/messaging/README.md
... | ... | @@ -0,0 +1 @@ |
1 | +Pustaka untuk center transaksi bertipe messaging (eg: sms, xmpp, telegram) |
center/messaging/trx-center.js
... | ... | @@ -0,0 +1,147 @@ |
1 | +"use strict"; | |
2 | + | |
3 | +const path = require('path'); | |
4 | +const request = require('request'); | |
5 | +const strftime = require('strftime'); | |
6 | +const config = require('../../config'); | |
7 | +const logger = require('../../logger'); | |
8 | + | |
9 | +const module_name = path.basename(__filename); | |
10 | + | |
11 | +let transport; | |
12 | + | |
13 | +function onOnline(params) { | |
14 | + logger.info('CENTER is ONLINE, ready to communicate'); | |
15 | + | |
16 | +} | |
17 | + | |
18 | +function onIncomingMessage(paramsFromTransport) { | |
19 | + logger.verbose('Reporting message to CORE') | |
20 | + | |
21 | + const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase(); | |
22 | + | |
23 | + if (config.commands.balance.indexOf(command) >= 0) { | |
24 | + executeBalanceCheck(paramsFromTransport); | |
25 | + } | |
26 | + else if (config.commands.price.indexOf(command) >= 0) { | |
27 | + executePriceCheck(paramsFromTransport); | |
28 | + } | |
29 | + else { | |
30 | + executePrepaidBuy(paramsFromTransport); | |
31 | + } | |
32 | +} | |
33 | + | |
34 | +function executeBalanceCheck(paramsFromTransport) { | |
35 | + const terminal_name = paramsFromTransport.partner.toLowerCase(); | |
36 | + const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1]; | |
37 | + | |
38 | + const requestOptions = { | |
39 | + url: config.core_url + '/services/balance', | |
40 | + qs: { | |
41 | + terminal_name: terminal_name, | |
42 | + password: password | |
43 | + } | |
44 | + } | |
45 | + | |
46 | + requestToCore(requestOptions); | |
47 | +} | |
48 | + | |
49 | +function executePriceCheck(paramsFromTransport) { | |
50 | + const requestOptions = { | |
51 | + url: config.core_url + '/services/pricelist', | |
52 | + qs: { | |
53 | + terminal_name: paramsFromTransport.partner.toLowerCase(), | |
54 | + keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1] | |
55 | + } | |
56 | + } | |
57 | + | |
58 | + requestToCore(requestOptions); | |
59 | +} | |
60 | + | |
61 | +function parseBalanceResponse(body) { | |
62 | + let result; | |
63 | + | |
64 | + try { | |
65 | + result = JSON.parse(body); | |
66 | + } | |
67 | + catch(e) { | |
68 | + logger.warn('Error JSON parsing', {module_name: module_name, method_name: 'parseBalanceResponse', body: body}) | |
69 | + result = null; | |
70 | + } | |
71 | + return result; | |
72 | +} | |
73 | + | |
74 | +function generateRequestId(req) { | |
75 | + return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d'); | |
76 | +} | |
77 | + | |
78 | +function executePrepaidBuy(paramsFromTransport) { | |
79 | + let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); | |
80 | + | |
81 | + let qs = { | |
82 | + request_id: null, | |
83 | + terminal_name: paramsFromTransport.partner.toLowerCase(), | |
84 | + product_name: tokens[0].toUpperCase(), | |
85 | + destination: tokens[1].toUpperCase(), | |
86 | + password: tokens[2], | |
87 | + origin: config.origin || config.username, | |
88 | + report_port: config.listen_port || '80', | |
89 | + msg: paramsFromTransport.msg | |
90 | + } | |
91 | + | |
92 | + qs.request_id = generateRequestId(qs); | |
93 | + if (tokens[3]) { | |
94 | + qs.request_id += '_' + tokens[3]; | |
95 | + } | |
96 | + | |
97 | + let requestOptions = { | |
98 | + url: config.core_url + '/prepaid/buy', | |
99 | + qs: qs | |
100 | + } | |
101 | + | |
102 | + requestToCore(requestOptions); | |
103 | +} | |
104 | + | |
105 | +function requestToCore(requestOptions, partner) { | |
106 | + logger.verbose('Requesting service to CORE', requestOptions); | |
107 | + | |
108 | + request(requestOptions, function(err, res, body) { | |
109 | + if (err || res.statusCode != 200) { | |
110 | + logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err}); | |
111 | + transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR'); | |
112 | + return; | |
113 | + } | |
114 | + | |
115 | + let result = parseBalanceResponse(body); | |
116 | + if (!result || !result.message) { | |
117 | + transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR'); | |
118 | + return; | |
119 | + } | |
120 | + | |
121 | + transport.send(requestOptions.qs.terminal_name, result.message); | |
122 | + }) | |
123 | +} | |
124 | + | |
125 | +function parseCoreMessage(body) { | |
126 | + let coreRes; | |
127 | + try { | |
128 | + coreRes = JSON.parse(body) | |
129 | + } | |
130 | + catch(err) { | |
131 | + logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err}); | |
132 | + coreRes = null; | |
133 | + } | |
134 | + return coreRes; | |
135 | +} | |
136 | + | |
137 | +const callback = { | |
138 | + onOnline: onOnline, | |
139 | + onIncomingMessage: onIncomingMessage | |
140 | +} | |
141 | + | |
142 | +function setTransport(_transport) { | |
143 | + transport = _transport; | |
144 | +} | |
145 | + | |
146 | +exports.callback = callback; | |
147 | +exports.setTransport = setTransport; |