Compare View

switch
from
...
to
 
Commits (3)

Changes

Showing 3 changed files Inline Diff

center/http-response-server.js
1 "use strict"; 1 "use strict";
2 2
3 /** 3 /**
4 * HTTP Response Server 4 * HTTP Response Server
5 * 5 *
6 * Untuk menangkap respon dari core 6 * Untuk menangkap respon dari core
7 */ 7 */
8 8
9 9
10 const http = require('http'); 10 const http = require('http');
11 const url = require('url'); 11 const url = require('url');
12 12
13 const config = require('../config'); 13 const config = require('../config');
14 const logger = require('../logger'); 14 const logger = require('../logger');
15 15
16 let transport; 16 let transport;
17 17
18 function onRequest(request, response) { 18 function onRequest(request, response) {
19 response.end('OK');
20 19 response.end('OK');
21 const qs = url.parse(request.url, true).query; 20
22 logger.verbose('Got reverse report from CORE', {qs: qs}); 21 const qs = url.parse(request.url, true).query;
23 22 logger.verbose('Got reverse report from CORE', {qs: qs});
24 if (!transport || !transport.send) { 23
25 logger.warn('UNDEFINED TRANSPORT, not forwarding message from CORE'); 24 if (!transport || !transport.send) {
26 return; 25 logger.warn('UNDEFINED TRANSPORT, not forwarding message from CORE');
27 } 26 return;
28 27 }
29 if (!qs.terminal_name || !qs.message) { 28
30 return; 29 if (!qs.terminal_name || !qs.message) {
31 } 30 return;
32 31 }
33 transport.send(qs.terminal_name, qs.message, qs); 32
34 } 33 transport.send(qs.terminal_name, qs.message, qs);
35 34 }
36 function setTransport(newTransport) { 35
37 transport = newTransport; 36 function setTransport(newTransport) {
38 } 37 transport = newTransport;
39 38 }
40 function create() { 39
41 let listenPort = config.listen_port; 40 function create() {
42 41 let listenPort = config.listen_port;
43 http.createServer(onRequest).listen(listenPort, function() { 42
44 logger.info('HTTP Reverse/Report server listen on port ' + listenPort + ' to process CORE message'); 43 http.createServer(onRequest).listen(listenPort, function() {
45 });; 44 logger.info('HTTP Reverse/Report server listen on port ' + listenPort + ' to process CORE message');
46 } 45 });;
47 46 }
48 create(); 47
49 48 create();
50 exports.setTransport = setTransport; 49
51 50 exports.setTransport = setTransport;
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 path = require('path'); 7 const path = require('path');
8 const request = require('request'); 8 const request = require('request');
9 const strftime = require('strftime'); 9 const strftime = require('strftime');
10 const config = require('../../config'); 10 const config = require('../../config');
11 const logger = require('../../logger'); 11 const logger = require('../../logger');
12 const httpResponseServer = require('../http-response-server'); 12 const httpResponseServer = require('../http-response-server');
13 13
14 const module_name = path.basename(__filename); 14 const module_name = path.basename(__filename);
15 15
16 let transport; 16 let transport;
17 17
18 function onOnline(params) { 18 function onOnline(params) {
19 logger.info('CENTER is ONLINE, ready to communicate'); 19 logger.info('CENTER is ONLINE, ready to communicate');
20 20
21 } 21 }
22 22
23 function onIncomingMessage(paramsFromTransport, cb) { 23 function onIncomingMessage(paramsFromTransport, cb) {
24 logger.verbose('Reporting message to CORE') 24 logger.verbose('Reporting message to CORE')
25 25
26 const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase(); 26 const command = paramsFromTransport.msg.split(/[\., ]+/)[0].toUpperCase();
27 27
28 if (config.commands && config.commands.balance.indexOf(command) >= 0) { 28 if (config.commands && config.commands.balance.indexOf(command) >= 0) {
29 executeBalanceCheck(paramsFromTransport, cb); 29 executeBalanceCheck(paramsFromTransport, cb);
30 } 30 }
31 else if (config.commands && config.commands.price.indexOf(command) >= 0) { 31 else if (config.commands && config.commands.price.indexOf(command) >= 0) {
32 executePriceCheck(paramsFromTransport, cb); 32 executePriceCheck(paramsFromTransport, cb);
33 } 33 }
34 else { 34 else {
35 executePrepaidBuy(paramsFromTransport, cb); 35 executePrepaidBuy(paramsFromTransport, cb);
36 } 36 }
37 } 37 }
38 38
39 function executeBalanceCheck(paramsFromTransport) { 39 function executeBalanceCheck(paramsFromTransport) {
40 const terminal_name = paramsFromTransport.partner.toLowerCase(); 40 const terminal_name = paramsFromTransport.partner.toLowerCase();
41 const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1]; 41 const password = paramsFromTransport.msg.trim().split(/[\., ]+/)[1];
42 42
43 const requestOptions = { 43 const requestOptions = {
44 url: config.core_url + '/services/balance', 44 url: config.core_url + '/services/balance',
45 qs: { 45 qs: {
46 terminal_name: terminal_name, 46 terminal_name: terminal_name,
47 password: password 47 password: password
48 } 48 }
49 } 49 }
50 50
51 requestToCore(requestOptions); 51 requestToCore(requestOptions);
52 } 52 }
53 53
54 function executePriceCheck(paramsFromTransport) { 54 function executePriceCheck(paramsFromTransport) {
55 const requestOptions = { 55 const requestOptions = {
56 url: config.core_url + '/services/pricelist', 56 url: config.core_url + '/services/pricelist',
57 qs: { 57 qs: {
58 terminal_name: paramsFromTransport.partner.toLowerCase(), 58 terminal_name: paramsFromTransport.partner.toLowerCase(),
59 keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1] 59 keyword: paramsFromTransport.msg.trim().split(/[\., ]+/)[1]
60 } 60 }
61 } 61 }
62 62
63 requestToCore(requestOptions); 63 requestToCore(requestOptions);
64 } 64 }
65 65
66 function parseCoreMessage(body) { 66 function parseCoreMessage(body) {
67 let coreRes; 67 let coreRes;
68 68
69 try { 69 try {
70 coreRes = JSON.parse(body) 70 coreRes = JSON.parse(body)
71 } 71 }
72 catch(err) { 72 catch(err) {
73 logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err}); 73 logger.warn('Exception on parsing CORE response as JSON', {body: body, err: err});
74 coreRes = null; 74 coreRes = null;
75 } 75 }
76 76
77 return coreRes; 77 return coreRes;
78 } 78 }
79 79
80 function generateRequestId(req) { 80 function generateRequestId(req) {
81 return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d'); 81 return 'AUTO_' + req.product_name + '_' + req.destination + '_' + strftime('%Y%m%d');
82 } 82 }
83 83
84 function executePrepaidBuy(paramsFromTransport, cb) { 84 function executePrepaidBuy(paramsFromTransport, cb) {
85 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/); 85 let tokens = paramsFromTransport.msg.trim().split(/[\., ]+/);
86 86
87 let qs = { 87 let qs = {
88 request_id: tokens[3], 88 request_id: tokens[3],
89 terminal_name: paramsFromTransport.partner.toLowerCase(), 89 terminal_name: paramsFromTransport.partner.toLowerCase(),
90 product_name: tokens[0].toUpperCase(), 90 product_name: tokens[0].toUpperCase(),
91 destination: tokens[1].toUpperCase(), 91 destination: tokens[1].toUpperCase(),
92 password: tokens[2], 92 password: tokens[2],
93 origin: config.origin || config.username, 93 origin: config.origin || config.username,
94 report_port: config.listen_port || '80', 94 report_port: config.listen_port || '80',
95 msg: paramsFromTransport.msg, 95 msg: paramsFromTransport.msg,
96 reverse_url: paramsFromTransport.reverse_url 96 reverse_url: paramsFromTransport.reverse_url
97 } 97 }
98 98
99 if (!config.do_not_prefix_request_id) { 99 if (!config.do_not_prefix_request_id) {
100 qs.request_id = generateRequestId(qs); 100 qs.request_id = generateRequestId(qs);
101 if (tokens[3]) { 101 if (tokens[3]) {
102 qs.request_id += '_' + tokens[3]; 102 qs.request_id += '_' + tokens[3];
103 } 103 }
104 } 104 }
105 105
106 let requestOptions = { 106 let requestOptions = {
107 url: config.core_url + '/prepaid/buy', 107 url: config.core_url + '/prepaid/buy',
108 qs: qs 108 qs: qs
109 } 109 }
110 110
111 requestToCore(requestOptions, cb); 111 requestToCore(requestOptions, cb);
112 } 112 }
113 113
114 function requestToCore(requestOptions, cb) { 114 function requestToCore(requestOptions, cb) {
115 logger.verbose('Requesting service to CORE', requestOptions); 115 logger.verbose('Requesting service to CORE', requestOptions);
116 116
117 request(requestOptions, function(err, res, body) { 117 request(requestOptions, function(err, res, body) {
118 if (err || res.statusCode != 200) { 118 if (err || res.statusCode != 200) {
119 logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err}); 119 logger.warn('Error requesting to CORE', {module_name: module_name, method_name: 'requestToCore', requestOptions: requestOptions, err: err});
120 if (cb) { 120 if (cb) {
121 cb(null, {msg: 'INTERNAL ERROR'}); 121 cb(null, {msg: 'INTERNAL ERROR'});
122 }
123 else if (transport.send) {
124 transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR');
125 }
122 } 126 return;
123 else if (transport.send) { 127 }
124 transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR'); 128
125 } 129 let result = parseCoreMessage(body);
126 return; 130 if (!result || !result.message) {
127 } 131 if (cb) {
128 132 cb(null, {msg: 'INTERNAL ERROR'});
133 }
134 else if (transport.send) {
135 transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR');
136 }
129 let result = parseCoreMessage(body); 137 return;
130 if (!result || !result.message) { 138 }
131 if (cb) { 139
132 cb(null, {msg: 'INTERNAL ERROR'});
133 } 140 if (cb) {
134 else if (transport.send) { 141 cb(null, result);
135 transport.send(requestOptions.qs.terminal_name, 'INTERNAL ERROR'); 142 }
143 else if (transport.send) {
144 transport.send(requestOptions.qs.terminal_name, result.message);
145
146 }
136 } 147 })
137 return; 148 }
138 } 149
139 150 function setTransport(_transport) {
140 if (cb) { 151 transport = _transport;
141 cb(null, result); 152 httpResponseServer.setTransport(transport);
142 } 153 }
143 else if (transport.send) { 154
144 transport.send(requestOptions.qs.terminal_name, result.message); 155 const callback = {
145 156 onOnline: onOnline,
146 } 157 onIncomingMessage: onIncomingMessage
147 }) 158 }
148 } 159
149 160 exports.callback = callback;
150 function setTransport(_transport) { 161 exports.setTransport = setTransport;
1 { 1 {
2 "name": "komodo-sdk", 2 "name": "komodo-sdk",
3 "version": "1.4.14", 3 "version": "1.4.15",
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 "request": "^2.81.0", 22 "request": "^2.81.0",
23 "strftime": "^0.10.0", 23 "strftime": "^0.10.0",
24 "winston": "^2.3.1", 24 "winston": "^2.3.1",
25 "winston-daily-rotate-file": "^1.4.6" 25 "winston-daily-rotate-file": "^1.4.6"
26 } 26 }
27 } 27 }
28 28