Commit 53aea5706ccad0c771e703b10cfeeb051122d34d
1 parent
ad94aae82d
Exists in
master
require resend-delay
Showing 1 changed file with 1 additions and 0 deletions Inline Diff
partner-otomax.js
1 | "use strict"; | 1 | "use strict"; |
2 | 2 | ||
3 | var request = require('request'); | 3 | var request = require('request'); |
4 | var crypto = require('crypto'); | 4 | var crypto = require('crypto'); |
5 | var url = require('url'); | 5 | var url = require('url'); |
6 | 6 | ||
7 | var resendDelay = require('sate24/resend-delay'); | ||
7 | var taskHistory = require('sate24/task-history'); | 8 | var taskHistory = require('sate24/task-history'); |
8 | var antiSameDayDupe = require('sate24/anti-same-day-dupe'); | 9 | var antiSameDayDupe = require('sate24/anti-same-day-dupe'); |
9 | 10 | ||
10 | var config; | 11 | var config; |
11 | var aaa; | 12 | var aaa; |
12 | var logger; | 13 | var logger; |
13 | 14 | ||
14 | 15 | ||
15 | function start(options) { | 16 | function start(options) { |
16 | if (!options) { | 17 | if (!options) { |
17 | console.log('Undefined options, terminating....'); | 18 | console.log('Undefined options, terminating....'); |
18 | process.exit(1); | 19 | process.exit(1); |
19 | } | 20 | } |
20 | 21 | ||
21 | if (options.config) { | 22 | if (options.config) { |
22 | config = options.config; | 23 | config = options.config; |
23 | } else { | 24 | } else { |
24 | console.log('Undefined options.config, terminating....') | 25 | console.log('Undefined options.config, terminating....') |
25 | process.exit(1); | 26 | process.exit(1); |
26 | } | 27 | } |
27 | 28 | ||
28 | if (options.aaa) { | 29 | if (options.aaa) { |
29 | aaa = options.aaa; | 30 | aaa = options.aaa; |
30 | } else { | 31 | } else { |
31 | console.log('Undefined options.aaa, terminating....') | 32 | console.log('Undefined options.aaa, terminating....') |
32 | process.exit(1); | 33 | process.exit(1); |
33 | } | 34 | } |
34 | 35 | ||
35 | if (options && options.logger) { | 36 | if (options && options.logger) { |
36 | logger = options.logger; | 37 | logger = options.logger; |
37 | } else { | 38 | } else { |
38 | console.log('Undefined options.logger, terminating....') | 39 | console.log('Undefined options.logger, terminating....') |
39 | process.exit(1); | 40 | process.exit(1); |
40 | } | 41 | } |
41 | 42 | ||
42 | resendDelay.init({ | 43 | resendDelay.init({ |
43 | config: config, | 44 | config: config, |
44 | topupRequest: topupRequest, | 45 | topupRequest: topupRequest, |
45 | logger: logger | 46 | logger: logger |
46 | }); | 47 | }); |
47 | 48 | ||
48 | taskHistory.init(options); | 49 | taskHistory.init(options); |
49 | antiSameDayDupe.init(options); | 50 | antiSameDayDupe.init(options); |
50 | 51 | ||
51 | createReverseHttpServer(); | 52 | createReverseHttpServer(); |
52 | } | 53 | } |
53 | 54 | ||
54 | function callbackReport(requestId, rc, message) { | 55 | function callbackReport(requestId, rc, message) { |
55 | if (responseCode != '68' || dontResendDelay) { | 56 | if (responseCode != '68' || dontResendDelay) { |
56 | resendDelay.cancel(requestId); | 57 | resendDelay.cancel(requestId); |
57 | } else { | 58 | } else { |
58 | taskHistory.get(requestId, function(err, archivedTask) { | 59 | taskHistory.get(requestId, function(err, archivedTask) { |
59 | if (archivedTask) { | 60 | if (archivedTask) { |
60 | logger.verbose('DEBUG', {archivedTask: archivedTask}); | 61 | logger.verbose('DEBUG', {archivedTask: archivedTask}); |
61 | resendDelay.register(archivedTask); | 62 | resendDelay.register(archivedTask); |
62 | } | 63 | } |
63 | }); | 64 | }); |
64 | } | 65 | } |
65 | 66 | ||
66 | options.aaa.callbackReportWithPushToMongoDb(requestId, rc, message); | 67 | options.aaa.callbackReportWithPushToMongoDb(requestId, rc, message); |
67 | } | 68 | } |
68 | 69 | ||
69 | function topupRequest(task) { | 70 | function topupRequest(task) { |
70 | if (!aaa.isTodayTrx(task)) { | 71 | if (!aaa.isTodayTrx(task)) { |
71 | logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); | 72 | logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); |
72 | callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); | 73 | callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); |
73 | resendDelay.cancel(task); | 74 | resendDelay.cancel(task); |
74 | return; | 75 | return; |
75 | } | 76 | } |
76 | 77 | ||
77 | aaa.insertTaskToMongoDb(task); | 78 | aaa.insertTaskToMongoDb(task); |
78 | antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest); | 79 | antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest); |
79 | } | 80 | } |
80 | 81 | ||
81 | function _topupRequest(task) { | 82 | function _topupRequest(task) { |
82 | taskHistory.put(task, function() { | 83 | taskHistory.put(task, function() { |
83 | requestToPartner(task);; | 84 | requestToPartner(task);; |
84 | }); | 85 | }); |
85 | } | 86 | } |
86 | 87 | ||
87 | function requestToPartner(task) { | 88 | function requestToPartner(task) { |
88 | let requestOptions = createRequestOptions(task); | 89 | let requestOptions = createRequestOptions(task); |
89 | 90 | ||
90 | request(requestOptions, function(error, response, body) { | 91 | request(requestOptions, function(error, response, body) { |
91 | if (error) { | 92 | if (error) { |
92 | logger.warn('Error requesting to partner', {task: task, error: error}); | 93 | logger.warn('Error requesting to partner', {task: task, error: error}); |
93 | callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error); | 94 | callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error); |
94 | return; | 95 | return; |
95 | } | 96 | } |
96 | 97 | ||
97 | if (response.statusCode != 200) { | 98 | if (response.statusCode != 200) { |
98 | logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); | 99 | logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); |
99 | callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); | 100 | callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); |
100 | return; | 101 | return; |
101 | } | 102 | } |
102 | 103 | ||
103 | parseMessage(task, message); | 104 | parseMessage(task, message); |
104 | }); | 105 | }); |
105 | } | 106 | } |
106 | 107 | ||
107 | function parseMessage(task, message) { | 108 | function parseMessage(task, message) { |
108 | let rc = '68'; | 109 | let rc = '68'; |
109 | 110 | ||
110 | if (message.indexOf('SUKSES') >= 0) { | 111 | if (message.indexOf('SUKSES') >= 0) { |
111 | rc = '00'; | 112 | rc = '00'; |
112 | } | 113 | } |
113 | else if (message.indexOf('GAGAL') >= 0) { | 114 | else if (message.indexOf('GAGAL') >= 0) { |
114 | rc = '40'; | 115 | rc = '40'; |
115 | } | 116 | } |
116 | 117 | ||
117 | callbackReport(task.requestId, rc, message); | 118 | callbackReport(task.requestId, rc, message); |
118 | } | 119 | } |
119 | 120 | ||
120 | function generateSign(userid, remoteProduct, destination, requestId, pin, password) { | 121 | function generateSign(userid, remoteProduct, destination, requestId, pin, password) { |
121 | let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); | 122 | let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); |
122 | let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); | 123 | let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); |
123 | let buffer = new Buffer(sha1); | 124 | let buffer = new Buffer(sha1); |
124 | 125 | ||
125 | return buffer.toString('base64'); | 126 | return buffer.toString('base64'); |
126 | } | 127 | } |
127 | 128 | ||
128 | function createRequestOptions(task) { | 129 | function createRequestOptions(task) { |
129 | return requestOptions = { | 130 | return requestOptions = { |
130 | url: config.h2h_out.partner, | 131 | url: config.h2h_out.partner, |
131 | qs: { | 132 | qs: { |
132 | memberID: config.h2h_out.userid, | 133 | memberID: config.h2h_out.userid, |
133 | product: task.remoteProduct, | 134 | product: task.remoteProduct, |
134 | dest: task.destination, | 135 | dest: task.destination, |
135 | refID: task.requestId, | 136 | refID: task.requestId, |
136 | sign: generateSign( | 137 | sign: generateSign( |
137 | config.h2h_out.userid, | 138 | config.h2h_out.userid, |
138 | task.remoteProduct, | 139 | task.remoteProduct, |
139 | task.destination, | 140 | task.destination, |
140 | task.requestId, | 141 | task.requestId, |
141 | config.h2h_out.pin, | 142 | config.h2h_out.pin, |
142 | confg.h2h_out.password | 143 | confg.h2h_out.password |
143 | ) | 144 | ) |
144 | } | 145 | } |
145 | }; | 146 | }; |
146 | } | 147 | } |
147 | 148 | ||
148 | function onSameDayDupe(task) { | 149 | function onSameDayDupe(task) { |
149 | callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); | 150 | callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); |
150 | } | 151 | } |
151 | 152 | ||
152 | function createReverseHttpServer() { | 153 | function createReverseHttpServer() { |
153 | var httpServer = http.createServer(function(request, response) { | 154 | var httpServer = http.createServer(function(request, response) { |
154 | let qs = url.parse(request.url, true).query; | 155 | let qs = url.parse(request.url, true).query; |
155 | logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); | 156 | logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); |
156 | }); | 157 | }); |
157 | 158 | ||
158 | httpServer.listen(config.h2h_out.listen_port, function() { | 159 | httpServer.listen(config.h2h_out.listen_port, function() { |
159 | logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); | 160 | logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); |
160 | }); | 161 | }); |
161 | } | 162 | } |
162 | 163 | ||
163 | exports.start = start; | 164 | exports.start = start; |
164 | exports.topupRequest = topupRequest; | 165 | exports.topupRequest = topupRequest; |
165 | exports.generateSign = generateSign; | 166 | exports.generateSign = generateSign; |
166 | 167 |