Commit af7c3484020a87edfeb6975347bc7a538217336b

Authored by Adhidarma Hadiwinoto
1 parent 53aea5706c
Exists in master

require http

Showing 1 changed file with 1 additions and 0 deletions Inline Diff

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