Compare View

switch
from
...
to
 
Commits (2)

Changes

Showing 2 changed files Inline Diff

center/messaging/trx-center.js
1 "use strict"; 1 "use strict";
2 2
3 /** 3 /**
4 * Trx Handler untuk center messaging 4 * Trx Handler untuk center messaging
5 */ 5 */
6 6
7 const module_name = require('path').basename(__filename); 7 const module_name = require('path').basename(__filename);
8 8
9 const request = require('request'); 9 const request = require('request');
10 const strftime = require('strftime'); 10 const strftime = require('strftime');
11 const config = require('../../config'); 11 const config = require('../../config');
12 const logger = require('../../logger'); 12 const logger = require('../../logger');
13 const httpResponseServer = require('../http-response-server'); 13 const httpResponseServer = require('../http-response-server');
14 const controlPanel = require('../../control-panel'); 14 const controlPanel = require('../../control-panel');
15 const heartbeat = require('../../heartbeat'); 15 const heartbeat = require('../../heartbeat');
16 16
17 let transport; 17 let transport;
18 18
19 process.title = "KOMODO-CENTER " + config.origin;
20
19 process.title = "KOMODO-CENTER " + config.origin; 21 heartbeat.setModuleType('center')
20 22
21 heartbeat.setModuleType('center') 23 function onOnline(params) {
22 24 logger.info('CENTER is ONLINE, ready to communicate');
23 function onOnline(params) { 25 }
24 logger.info('CENTER is ONLINE, ready to communicate'); 26
25 } 27 function onIncomingMessage(paramsFromTransport, cb) {
26 28 logger.verbose('Reporting message to CORE')
27 function onIncomingMessage(paramsFromTransport, cb) { 29
28 logger.verbose('Reporting message to CORE') 30 const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase();
29 31
30 const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase(); 32 if (config.commands && config.commands.balance && config.commands.balance.indexOf(command) >= 0) {
31 33 executeBalanceCheck(paramsFromTransport, cb);
32 if (config.commands && config.commands.balance && config.commands.balance.indexOf(command) >= 0) { 34 }
33 executeBalanceCheck(paramsFromTransport, cb); 35 else if (config.commands && config.commands.price && config.commands.price.indexOf(command) >= 0) {
34 } 36 executePriceCheck(paramsFromTransport, cb);
35 else if (config.commands && config.commands.price && config.commands.price.indexOf(command) >= 0) { 37 }
36 executePriceCheck(paramsFromTransport, cb); 38 else if (config.commands && config.commands.postpaid_inquiry && config.commands.postpaid_inquiry.indexOf(command) >= 0) {
37 } 39 executePostpaidInquiry(paramsFromTransport, cb);
38 else if (config.commands && config.commands.postpaid_inquiry && config.commands.postpaid_inquiry.indexOf(command) >= 0) { 40
39 executePostpaidInquiry(paramsFromTransport, cb); 41 }
40 42 else if (config.commands && config.commands.postpaid_pay && config.commands.postpaid_pay.indexOf(command) >= 0) {
41 } 43 executePostpaidPay(paramsFromTransport, cb);
42 else if (config.commands && config.commands.postpaid_pay && config.commands.postpaid_pay.indexOf(command) >= 0) { 44 }
43 executePostpaidPay(paramsFromTransport, cb); 45 else {
44 } 46 executePrepaidBuy(paramsFromTransport, cb);
45 else { 47 }
46 executePrepaidBuy(paramsFromTransport, cb); 48 }
47 } 49
48 } 50 function executeBalanceCheck(paramsFromTransport) {
49 51 const terminal_name = paramsFromTransport.partner.toLowerCase();
50 function executeBalanceCheck(paramsFromTransport) { 52 const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1];
51 const terminal_name = paramsFromTransport.partner.toLowerCase(); 53
52 const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1]; 54 const requestOptions = {
53 55 url: config.core_url + '/services/balance',
54 const requestOptions = { 56 qs: {
55 url: config.core_url + '/services/balance', 57 terminal_name: terminal_name,
56 qs: { 58 password: password,
57 terminal_name: terminal_name, 59 msg: paramsFromTransport.msg
58 password: password, 60 }
59 msg: paramsFromTransport.msg 61 }
60 } 62
61 } 63 requestToCore(requestOptions);
62 64 }
63 requestToCore(requestOptions); 65
64 } 66 function executePriceCheck(paramsFromTransport) {
65 67 const requestOptions = {
66 function executePriceCheck(paramsFromTransport) { 68 url: config.core_url + '/services/pricelist',
67 const requestOptions = { 69 qs: {
68 url: config.core_url + '/services/pricelist', 70 terminal_name: paramsFromTransport.partner.toLowerCase(),
69 qs: { 71 keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1],
70 terminal_name: paramsFromTransport.partner.toLowerCase(), 72 password: paramsFromTransport.msg.trim().split(/[\., ]+/)[2],
71 keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1], 73 postpaid: 0,
72 password: paramsFromTransport.msg.trim().split(/[\., ]+/)[2], 74 msg: paramsFromTransport.msg
73 postpaid: 0, 75 }
74 msg: paramsFromTransport.msg 76 }
75 } 77
76 } 78 requestToCore(requestOptions);
77 79 }
78 requestToCore(requestOptions); 80
79 } 81 function parseCoreMessage(body) {
80 82 let coreRes;
81 function parseCoreMessage(body) { 83
82 let coreRes; 84 try {
83 85 coreRes = JSON.parse(body)
84 try { 86 }
85 coreRes = JSON.parse(body) 87 catch(err) {
86 } 88 logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err});
87 catch(err) { 89 coreRes = null;
88 logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err}); 90 }
89 coreRes = null; 91
90 } 92 return coreRes;
91 93 }
92 return coreRes; 94
93 } 95 function generateRequestId(req) {
94 96 return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d');
95 function generateRequestId(req) { 97 }
96 return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d'); 98
97 } 99 function executePrepaidBuy(paramsFromTransport, cb) {
98 100 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
99 function executePrepaidBuy(paramsFromTransport, cb) { 101
100 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); 102 let qs = {
101 103 request_id: tokens[3],
102 let qs = { 104 terminal_name: paramsFromTransport.partner.toLowerCase(),
103 request_id: tokens[3], 105 product_name: tokens[0].toUpperCase(),
104 terminal_name: paramsFromTransport.partner.toLowerCase(), 106 destination: tokens[1].toUpperCase(),
105 product_name: tokens[0].toUpperCase(), 107 password: tokens[2],
106 destination: tokens[1].toUpperCase(), 108 origin: config.origin || config.username,
107 password: tokens[2], 109 report_port: config.listen_port || '80',
108 origin: config.origin || config.username, 110 msg: paramsFromTransport.msg,
109 report_port: config.listen_port || '80', 111 reverse_url: paramsFromTransport.reverse_url
110 msg: paramsFromTransport.msg, 112 }
111 reverse_url: paramsFromTransport.reverse_url 113
112 } 114 if (!config.do_not_prefix_request_id) {
113 115 qs.request_id = generateRequestId(qs);
114 if (!config.do_not_prefix_request_id) { 116 if (tokens[3]) {
115 qs.request_id = generateRequestId(qs); 117 qs.request_id += '_' + tokens[3];
116 if (tokens[3]) { 118 }
117 qs.request_id += '_' + tokens[3]; 119 }
118 } 120
119 } 121 let requestOptions = {
120 122 url: config.core_url + '/prepaid/buy',
121 let requestOptions = { 123 qs: qs
122 url: config.core_url + '/prepaid/buy', 124 }
123 qs: qs 125
124 } 126 requestToCore(requestOptions, cb);
125 127 }
126 requestToCore(requestOptions, cb); 128
127 } 129 function executePostpaidInquiry(paramsFromTransport, cb) {
128 130 // PAY.PLN.1234567890.PIN
129 function executePostpaidInquiry(paramsFromTransport, cb) { 131
130 // PAY.PLN.1234567890.PIN 132 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
131 133
132 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); 134 let qs = {
133 135 request_id: tokens[4],
134 let qs = { 136 terminal_name: paramsFromTransport.partner.toLowerCase(),
135 request_id: tokens[4], 137 product_name: tokens[1].toUpperCase(),
136 terminal_name: paramsFromTransport.partner.toLowerCase(), 138 destination: tokens[2].toUpperCase(),
137 product_name: tokens[1].toUpperCase(), 139 password: tokens[3],
138 destination: tokens[2].toUpperCase(), 140 origin: config.origin || config.username,
139 password: tokens[3], 141 report_port: config.listen_port || '80',
140 origin: config.origin || config.username, 142 msg: paramsFromTransport.msg,
141 report_port: config.listen_port || '80', 143 reverse_url: paramsFromTransport.reverse_url
142 msg: paramsFromTransport.msg, 144 }
143 reverse_url: paramsFromTransport.reverse_url 145
144 } 146 if (!config.do_not_prefix_request_id) {
145 147 qs.request_id = generateRequestId(qs) + '_INQ';
146 if (!config.do_not_prefix_request_id) { 148 if (tokens[4]) {
147 qs.request_id = generateRequestId(qs) + '_INQ'; 149 qs.request_id += '_' + tokens[4];
148 if (tokens[4]) { 150 }
149 qs.request_id += '_' + tokens[4]; 151 }
150 } 152
151 } 153 let requestOptions = {
152 154 url: config.core_url + '/postpaid/inquiry',
153 let requestOptions = { 155 qs: qs
154 url: config.core_url + '/postpaid/inquiry', 156 }
155 qs: qs 157
156 } 158 requestToCore(requestOptions, cb);
157 159 }
158 requestToCore(requestOptions, cb); 160
159 } 161 function executePostpaidPay(paramsFromTransport, cb) {
160 162 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
161 function executePostpaidPay(paramsFromTransport, cb) { 163
162 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); 164 let qs = {
163 165 request_id: tokens[4],
164 let qs = { 166 terminal_name: paramsFromTransport.partner.toLowerCase(),
165 request_id: tokens[4], 167 product_name: tokens[1].toUpperCase(),
166 terminal_name: paramsFromTransport.partner.toLowerCase(), 168 destination: tokens[2].toUpperCase(),
167 product_name: tokens[1].toUpperCase(), 169 password: tokens[3],
168 destination: tokens[2].toUpperCase(), 170 origin: config.origin || config.username,
169 password: tokens[3], 171 report_port: config.listen_port || '80',
170 origin: config.origin || config.username, 172 msg: paramsFromTransport.msg,
171 report_port: config.listen_port || '80', 173 reverse_url: paramsFromTransport.reverse_url
172 msg: paramsFromTransport.msg, 174 }
173 reverse_url: paramsFromTransport.reverse_url 175
174 } 176 if (!config.do_not_prefix_request_id) {
175 177 qs.request_id = generateRequestId(qs);
176 if (!config.do_not_prefix_request_id) { 178 if (tokens[4]) {
177 qs.request_id = generateRequestId(qs); 179 qs.request_id += '_' + tokens[4];
178 if (tokens[4]) { 180 }
179 qs.request_id += '_' + tokens[4]; 181 }
180 } 182
181 } 183 let requestOptions = {
182 184 url: config.core_url + '/postpaid/pay',
183 let requestOptions = { 185 qs: qs
184 url: config.core_url + '/postpaid/pay', 186 }
185 qs: qs 187
186 } 188 requestToCore(requestOptions, cb);
187 189 }
188 requestToCore(requestOptions, cb); 190
189 } 191 function requestToCore(requestOptions, cb) {
190 192 logger.verbose('Requesting service to CORE', requestOptions);
191 function requestToCore(requestOptions, cb) { 193
192 logger.verbose('Requesting service to CORE', requestOptions); 194 request(requestOptions, function(err, res, body) {
193 195 if (err || res.statusCode != 200) {
194 request(requestOptions, function(err, res, body) { 196 logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err});
195 if (err || res.statusCode != 200) { 197 let msg = "INTERNAL ERROR";
196 logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err}); 198 if (requestOptions.qs.msg) {
197 let msg = "INTERNAL ERROR"; 199 msg = requestOptions.qs.msg + ": " + msg;
198 if (requestOptions.qs.msg) { 200 }
199 msg = requestOptions.qs.msg + ": " + msg; 201
200 } 202 if (cb) {
201 203 cb(null, {msg: msg});
202 if (cb) { 204 }
203 cb(null, {msg: msg}); 205 else if (transport.send) {
204 } 206 transport.send(requestOptions.qs.terminal_name, msg);
205 else if (transport.send) { 207 }
206 transport.send(requestOptions.qs.terminal_name, msg); 208 return;
207 } 209 }
208 return; 210
209 } 211 let result = parseCoreMessage(body);
210 212 if (!result || !result.message) {
211 let result = parseCoreMessage(body); 213 let msg = "INTERNAL ERROR";
212 if (!result || !result.message) { 214 if (requestOptions.qs.msg) {
213 let msg = "INTERNAL ERROR"; 215 msg = requestOptions.qs.msg + ": " + msg;
214 if (requestOptions.qs.msg) { 216 }
215 msg = requestOptions.qs.msg + ": " + msg; 217
216 } 218 if (cb) {
217 219 cb(null, {msg: msg});
218 if (cb) { 220 }
219 cb(null, {msg: msg}); 221 else if (transport.send) {
220 } 222 transport.send(requestOptions.qs.terminal_name, msg);
221 else if (transport.send) { 223 }
222 transport.send(requestOptions.qs.terminal_name, msg); 224 return;
223 } 225 }
224 return; 226
225 } 227 if (cb) {
226 228 cb(null, result);
227 if (cb) { 229 }
228 cb(null, result); 230 else if (transport.send) {
229 } 231 transport.send(requestOptions.qs.terminal_name, result.message);
230 else if (transport.send) { 232
231 transport.send(requestOptions.qs.terminal_name, result.message); 233 }
232 234 })
233 } 235 }
234 }) 236
235 } 237 function setTransport(_transport) {
236 238 transport = _transport;
237 function setTransport(_transport) { 239 httpResponseServer.setTransport(transport);
238 transport = _transport; 240 }
239 httpResponseServer.setTransport(transport); 241
240 } 242 const callback = {
241 243 onOnline: onOnline,
242 const callback = { 244 onIncomingMessage: onIncomingMessage
243 onOnline: onOnline, 245 }
244 onIncomingMessage: onIncomingMessage 246
245 } 247 exports.callback = callback;
246 248 exports.setTransport = setTransport;
247 exports.callback = callback; 249
1 { 1 {
2 "name": "komodo-sdk", 2 "name": "komodo-sdk",
3 "version": "1.18.0", 3 "version": "1.19.0",
4 "description": "SDK for Komodo", 4 "description": "SDK for Komodo",
5 "main": "index.js", 5 "main": "index.js",
6 "scripts": { 6 "scripts": {
7 "test": "mocha", 7 "test": "mocha",
8 "postversion": "git push && git push --tags" 8 "postversion": "git push && git push --tags"
9 }, 9 },
10 "repository": { 10 "repository": {
11 "type": "git", 11 "type": "git",
12 "url": "git@gitlab.kodesumber.com:komodo/komodo-sdk.git" 12 "url": "git@gitlab.kodesumber.com:komodo/komodo-sdk.git"
13 }, 13 },
14 "keywords": [ 14 "keywords": [
15 "ppob", 15 "ppob",
16 "payment", 16 "payment",
17 "komodo" 17 "komodo"
18 ], 18 ],
19 "author": "Adhidarma Hadiwinoto <gua@adhisimon.org>", 19 "author": "Adhidarma Hadiwinoto <gua@adhisimon.org>",
20 "license": "ISC", 20 "license": "ISC",
21 "dependencies": { 21 "dependencies": {
22 "basic-auth": "^2.0.0", 22 "basic-auth": "^2.0.0",
23 "body-parser": "^1.18.2", 23 "body-parser": "^1.18.2",
24 "express": "^4.16.3", 24 "express": "^4.16.3",
25 "express-session": "^1.15.6", 25 "express-session": "^1.15.6",
26 "lru-cache": "^4.1.1", 26 "lru-cache": "^4.1.1",
27 "macaddress": "^0.2.8", 27 "macaddress": "^0.2.8",
28 "moment": "^2.19.1", 28 "moment": "^2.19.1",
29 "node-machine-id": "^1.1.10", 29 "node-machine-id": "^1.1.10",
30 "node-natural-sort": "^0.8.6", 30 "node-natural-sort": "^0.8.6",
31 "numeral": "^2.0.6", 31 "numeral": "^2.0.6",
32 "nunjucks": "^3.0.1", 32 "nunjucks": "^3.0.1",
33 "redis": "^2.8.0", 33 "redis": "^2.8.0",
34 "request": "^2.81.0", 34 "request": "^2.81.0",
35 "sha1": "^1.1.1", 35 "sha1": "^1.1.1",
36 "simple-git": "^1.80.1", 36 "simple-git": "^1.80.1",
37 "strftime": "^0.10.0", 37 "strftime": "^0.10.0",
38 "uniqid": "^4.1.1", 38 "uniqid": "^4.1.1",
39 "uuid": "^3.1.0", 39 "uuid": "^3.1.0",
40 "winston": "^2.3.1", 40 "winston": "^2.3.1",
41 "winston-circular-buffer": "^1.0.0", 41 "winston-circular-buffer": "^1.0.0",
42 "winston-daily-rotate-file": "^1.4.6" 42 "winston-daily-rotate-file": "^1.4.6"
43 } 43 }
44 } 44 }
45 45