Compare View

switch
from
...
to
 
Commits (2)

Changes

Showing 3 changed files Inline Diff

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