Compare View

switch
from
...
to
 
Commits (5)

Changes

Showing 3 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 heartbeat.setModuleType('center') 19 heartbeat.setModuleType('center')
20 20
21 function onOnline(params) { 21 function onOnline(params) {
22 logger.info('CENTER is ONLINE, ready to communicate'); 22 logger.info('CENTER is ONLINE, ready to communicate');
23 } 23 }
24 24
25 function onIncomingMessage(paramsFromTransport, cb) { 25 function onIncomingMessage(paramsFromTransport, cb) {
26 logger.verbose('Reporting message to CORE') 26 logger.verbose('Reporting message to CORE')
27 27
28 const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase(); 28 const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase();
29 29
30 if (config.commands && config.commands.balance && config.commands.balance.indexOf(command) >= 0) { 30 if (config.commands && config.commands.balance && config.commands.balance.indexOf(command) >= 0) {
31 executeBalanceCheck(paramsFromTransport, cb); 31 executeBalanceCheck(paramsFromTransport, cb);
32 } 32 }
33 else if (config.commands && config.commands.price && config.commands.price.indexOf(command) >= 0) { 33 else if (config.commands && config.commands.price && config.commands.price.indexOf(command) >= 0) {
34 executePriceCheck(paramsFromTransport, cb); 34 executePriceCheck(paramsFromTransport, cb);
35 } 35 }
36 else if (config.commands && config.commands.postpaid_inquiry && config.commands.postpaid_inquiry.indexOf(command) >= 0) { 36 else if (config.commands && config.commands.postpaid_inquiry && config.commands.postpaid_inquiry.indexOf(command) >= 0) {
37 executePostpaidInquiry(paramsFromTransport, cb); 37 executePostpaidInquiry(paramsFromTransport, cb);
38 38
39 } 39 }
40 else if (config.commands && config.commands.postpaid_pay && config.commands.postpaid_pay.indexOf(command) >= 0) { 40 else if (config.commands && config.commands.postpaid_pay && config.commands.postpaid_pay.indexOf(command) >= 0) {
41 executePostpaidPay(paramsFromTransport, cb); 41 executePostpaidPay(paramsFromTransport, cb);
42 } 42 }
43 else { 43 else {
44 executePrepaidBuy(paramsFromTransport, cb); 44 executePrepaidBuy(paramsFromTransport, cb);
45 } 45 }
46 } 46 }
47 47
48 function executeBalanceCheck(paramsFromTransport) { 48 function executeBalanceCheck(paramsFromTransport) {
49 const terminal_name = paramsFromTransport.partner.toLowerCase(); 49 const terminal_name = paramsFromTransport.partner.toLowerCase();
50 const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1]; 50 const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1];
51 51
52 const requestOptions = { 52 const requestOptions = {
53 url: config.core_url + '/services/balance', 53 url: config.core_url + '/services/balance',
54 qs: { 54 qs: {
55 terminal_name: terminal_name, 55 terminal_name: terminal_name,
56 password: password 56 password: password
57 } 57 }
58 } 58 }
59 59
60 requestToCore(requestOptions); 60 requestToCore(requestOptions);
61 } 61 }
62 62
63 function executePriceCheck(paramsFromTransport) { 63 function executePriceCheck(paramsFromTransport) {
64 const requestOptions = { 64 const requestOptions = {
65 url: config.core_url + '/services/pricelist', 65 url: config.core_url + '/services/pricelist',
66 qs: { 66 qs: {
67 terminal_name: paramsFromTransport.partner.toLowerCase(), 67 terminal_name: paramsFromTransport.partner.toLowerCase(),
68 keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1], 68 keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1],
69 password: paramsFromTransport.msg.trim().split(/[\., ]+/)[2], 69 password: paramsFromTransport.msg.trim().split(/[\., ]+/)[2],
70 postpaid: 0, 70 postpaid: 0,
71 } 71 }
72 } 72 }
73 73
74 requestToCore(requestOptions); 74 requestToCore(requestOptions);
75 } 75 }
76 76
77 function parseCoreMessage(body) { 77 function parseCoreMessage(body) {
78 let coreRes; 78 let coreRes;
79 79
80 try { 80 try {
81 coreRes = JSON.parse(body) 81 coreRes = JSON.parse(body)
82 } 82 }
83 catch(err) { 83 catch(err) {
84 logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err}); 84 logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err});
85 coreRes = null; 85 coreRes = null;
86 } 86 }
87 87
88 return coreRes; 88 return coreRes;
89 } 89 }
90 90
91 function generateRequestId(req) { 91 function generateRequestId(req) {
92 return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d'); 92 return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d');
93 } 93 }
94 94
95 function executePrepaidBuy(paramsFromTransport, cb) { 95 function executePrepaidBuy(paramsFromTransport, cb) {
96 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); 96 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
97 97
98 let qs = { 98 let qs = {
99 request_id: tokens[3], 99 request_id: tokens[3],
100 terminal_name: paramsFromTransport.partner.toLowerCase(), 100 terminal_name: paramsFromTransport.partner.toLowerCase(),
101 product_name: tokens[0].toUpperCase(), 101 product_name: tokens[0].toUpperCase(),
102 destination: tokens[1].toUpperCase(), 102 destination: tokens[1].toUpperCase(),
103 password: tokens[2], 103 password: tokens[2],
104 origin: config.origin || config.username, 104 origin: config.origin || config.username,
105 report_port: config.listen_port || '80', 105 report_port: config.listen_port || '80',
106 msg: paramsFromTransport.msg, 106 msg: paramsFromTransport.msg,
107 reverse_url: paramsFromTransport.reverse_url 107 reverse_url: paramsFromTransport.reverse_url
108 } 108 }
109 109
110 if (!config.do_not_prefix_request_id) { 110 if (!config.do_not_prefix_request_id) {
111 qs.request_id = generateRequestId(qs); 111 qs.request_id = generateRequestId(qs);
112 if (tokens[3]) { 112 if (tokens[3]) {
113 qs.request_id += '_' + tokens[3]; 113 qs.request_id += '_' + tokens[3];
114 } 114 }
115 } 115 }
116 116
117 let requestOptions = { 117 let requestOptions = {
118 url: config.core_url + '/prepaid/buy', 118 url: config.core_url + '/prepaid/buy',
119 qs: qs 119 qs: qs
120 } 120 }
121 121
122 requestToCore(requestOptions, cb); 122 requestToCore(requestOptions, cb);
123 } 123 }
124 124
125 function executePostpaidInquiry(paramsFromTransport, cb) { 125 function executePostpaidInquiry(paramsFromTransport, cb) {
126 // PAY.PLN.1234567890.PIN 126 // PAY.PLN.1234567890.PIN
127 127
128 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); 128 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
129 129
130 let qs = { 130 let qs = {
131 request_id: tokens[4], 131 request_id: tokens[4],
132 terminal_name: paramsFromTransport.partner.toLowerCase(), 132 terminal_name: paramsFromTransport.partner.toLowerCase(),
133 product_name: tokens[1].toUpperCase(), 133 product_name: tokens[1].toUpperCase(),
134 destination: tokens[2].toUpperCase(), 134 destination: tokens[2].toUpperCase(),
135 password: tokens[3], 135 password: tokens[3],
136 origin: config.origin || config.username, 136 origin: config.origin || config.username,
137 report_port: config.listen_port || '80', 137 report_port: config.listen_port || '80',
138 msg: paramsFromTransport.msg, 138 msg: paramsFromTransport.msg,
139 reverse_url: paramsFromTransport.reverse_url 139 reverse_url: paramsFromTransport.reverse_url
140 } 140 }
141 141
142 if (!config.do_not_prefix_request_id) { 142 if (!config.do_not_prefix_request_id) {
143 qs.request_id = generateRequestId(qs); 143 qs.request_id = generateRequestId(qs);
144 if (tokens[3]) { 144 if (tokens[3]) {
145 qs.request_id += '_' + tokens[3]; 145 qs.request_id += '_' + tokens[3];
146 } 146 }
147 } 147 }
148 148
149 let requestOptions = { 149 let requestOptions = {
150 url: config.core_url + '/postpaid/inquiry', 150 url: config.core_url + '/postpaid/inquiry',
151 qs: qs 151 qs: qs
152 } 152 }
153 153
154 requestToCore(requestOptions, cb); 154 requestToCore(requestOptions, cb);
155 } 155 }
156 156
157 function executePostpaidPay(paramsFromTransport, cb) { 157 function executePostpaidPay(paramsFromTransport, cb) {
158 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
159
160 let qs = { 158 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
161 request_id: tokens[4], 159
162 terminal_name: paramsFromTransport.partner.toLowerCase(), 160 let qs = {
163 product_name: tokens[1].toUpperCase(), 161 request_id: tokens[4],
164 destination: tokens[2].toUpperCase(), 162 terminal_name: paramsFromTransport.partner.toLowerCase(),
165 password: tokens[3], 163 product_name: tokens[1].toUpperCase(),
166 origin: config.origin || config.username, 164 destination: tokens[2].toUpperCase(),
167 report_port: config.listen_port || '80', 165 password: tokens[3],
168 msg: paramsFromTransport.msg, 166 origin: config.origin || config.username,
169 reverse_url: paramsFromTransport.reverse_url 167 report_port: config.listen_port || '80',
170 } 168 msg: paramsFromTransport.msg,
171 169 reverse_url: paramsFromTransport.reverse_url
172 if (!config.do_not_prefix_request_id) { 170 }
173 qs.request_id = generateRequestId(qs); 171
174 if (tokens[3]) { 172 if (!config.do_not_prefix_request_id) {
175 qs.request_id += '_' + tokens[3]; 173 qs.request_id = generateRequestId(qs);
176 } 174 if (tokens[3]) {
177 } 175 qs.request_id += '_' + tokens[3];
178 176 }
179 let requestOptions = { 177 }
180 url: config.core_url + '/postpaid/pay', 178
181 qs: qs 179 let requestOptions = {
182 } 180 url: config.core_url + '/postpaid/pay',
183 181 qs: qs
184 requestToCore(requestOptions, cb); 182 }
185 } 183
186 184 requestToCore(requestOptions, cb);
187 function requestToCore(requestOptions, cb) { 185 }
188 logger.verbose('Requesting service to CORE', requestOptions); 186
189 187 function requestToCore(requestOptions, cb) {
190 request(requestOptions, function(err, res, body) { 188 logger.verbose('Requesting service to CORE', requestOptions);
191 if (err || res.statusCode != 200) { 189
192 logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err}); 190 request(requestOptions, function(err, res, body) {
193 if (cb) { 191 if (err || res.statusCode != 200) {
194 cb(null, {msg: requestOptions.qs.msg + ': INTERNAL ERROR'}); 192 logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err});
195 } 193 if (cb) {
196 else if (transport.send) { 194 cb(null, {msg: requestOptions.qs.msg + ': INTERNAL ERROR'});
197 transport.send(requestOptions.qs.terminal_name, requestOptions.qs.msg + ': INTERNAL ERROR'); 195 }
198 } 196 else if (transport.send) {
199 return; 197 transport.send(requestOptions.qs.terminal_name, requestOptions.qs.msg + ': INTERNAL ERROR');
200 } 198 }
201 199 return;
202 let result = parseCoreMessage(body); 200 }
203 if (!result || !result.message) { 201
204 if (cb) { 202 let result = parseCoreMessage(body);
205 cb(null, {msg: 'INTERNAL ERROR'}); 203 if (!result || !result.message) {
206 } 204 if (cb) {
207 else if (transport.send) { 205 cb(null, {msg: 'INTERNAL ERROR'});
208 transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR'); 206 }
209 } 207 else if (transport.send) {
210 return; 208 transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR');
211 } 209 }
212 210 return;
213 if (cb) { 211 }
214 cb(null, result); 212
215 } 213 if (cb) {
216 else if (transport.send) { 214 cb(null, result);
217 transport.send(requestOptions.qs.terminal_name, result.message); 215 }
218 216 else if (transport.send) {
219 } 217 transport.send(requestOptions.qs.terminal_name, result.message);
220 }) 218
221 } 219 }
222 220 })
223 function setTransport(_transport) { 221 }
224 transport = _transport; 222
225 httpResponseServer.setTransport(transport); 223 function setTransport(_transport) {
226 } 224 transport = _transport;
227 225 httpResponseServer.setTransport(transport);
228 const callback = { 226 }
229 onOnline: onOnline, 227
230 onIncomingMessage: onIncomingMessage 228 const callback = {
231 } 229 onOnline: onOnline,
232 230 onIncomingMessage: onIncomingMessage
233 exports.callback = callback; 231 }
234 exports.setTransport = setTransport; 232
235 233 exports.callback = callback;
1 "use strict"; 1 "use strict";
2 2
3 const request = require('request'); 3 const request = require('request');
4 4
5 const config = require('./config'); 5 const config = require('./config');
6 const logger = require('./logger'); 6 const logger = require('./logger');
7 const matrix = require('./matrix'); 7 const matrix = require('./matrix');
8 8
9 let module_type; 9 let module_type;
10 10
11 function sendHeartbeat() { 11 function sendHeartbeat() {
12 if (!config || !config.core_url || !module_type) { return; } 12 if (!config || !config.core_url || !module_type) { return; }
13 13
14 let heartbeat_name = config.handler_name || config.origin; 14 let heartbeat_name = config.handler_name || config.origin;
15 if (config.username) { 15 if (config.username) {
16 heartbeat_name += '/' + config.username; 16 heartbeat_name += '/' + config.username;
17 } 17 }
18 18
19 if (!heartbeat_name) { 19 if (!heartbeat_name) {
20 logger.warn('Unknown heartbeat name, skip sending heartbeat'); 20 logger.warn('Unknown heartbeat name, skip sending heartbeat');
21 return; 21 return;
22 } 22 }
23 23
24 const requestOptions = { 24 const requestOptions = {
25 uri: config.core_url + '/heartbeats', 25 uri: config.core_url + '/heartbeats',
26 method: 'POST', 26 method: 'POST',
27 json: { 27 json: {
28 name: heartbeat_name, 28 name: heartbeat_name,
29 module_type: module_type, 29 module_type: module_type,
30 config: config, 30 config: config,
31 matrix: matrix 31 matrix: matrix
32 } 32 }
33 } 33 }
34 34
35 request.post(requestOptions, function(err, res, body) { 35 request.post(requestOptions, function(err, res, body) {
36
37 });
36 38 }
37 }); 39
38 } 40 setInterval(
39 41 sendHeartbeat,
40 setInterval( 42 60 * 1000
41 sendHeartbeat, 43 )
42 60 * 1000 44
43 ) 45 function setModuleType(value) {
44 46 logger.verbose('Set heartbeat module type as ' + value + ' and starting to send heartbeat per interval');
45 function setModuleType(value) { 47 module_type = value;
46 logger.verbose('Set heartbeat module type as ' + value + ' and starting to send heartbeat per interval'); 48 sendHeartbeat();
47 module_type = value; 49 }
48 sendHeartbeat(); 50
49 } 51 exports.setModuleType = setModuleType;
50 52
1 { 1 {
2 "name": "komodo-sdk", 2 "name": "komodo-sdk",
3 "version": "1.13.3", 3 "version": "1.13.4",
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.2", 24 "express": "^4.16.2",
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 "moment": "^2.19.1", 27 "moment": "^2.19.1",
28 "numeral": "^2.0.6", 28 "numeral": "^2.0.6",
29 "nunjucks": "^3.0.1", 29 "nunjucks": "^3.0.1",
30 "request": "^2.81.0", 30 "request": "^2.81.0",
31 "simple-git": "^1.80.1", 31 "simple-git": "^1.80.1",
32 "strftime": "^0.10.0", 32 "strftime": "^0.10.0",
33 "uniqid": "^4.1.1", 33 "uniqid": "^4.1.1",
34 "uuid": "^3.1.0", 34 "uuid": "^3.1.0",
35 "winston": "^2.3.1", 35 "winston": "^2.3.1",
36 "winston-circular-buffer": "^1.0.0", 36 "winston-circular-buffer": "^1.0.0",
37 "winston-daily-rotate-file": "^1.4.6" 37 "winston-daily-rotate-file": "^1.4.6"
38 } 38 }
39 } 39 }
40 40