Compare View

switch
from
...
to
 
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
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