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