Compare View
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 |
package.json
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 |