From 13829a751ee1974a0a45a6098dfddfa8da066e8e Mon Sep 17 00:00:00 2001 From: Adhidarma Hadiwinoto <gua@adhisimon.org> Date: Wed, 26 Jul 2017 11:09:51 +0700 Subject: [PATCH] topupAdvice --- partner-bnisp.js | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++------ test.js | 15 +++++++++ 2 files changed, 99 insertions(+), 10 deletions(-) diff --git a/partner-bnisp.js b/partner-bnisp.js index a16839c..0362c36 100644 --- a/partner-bnisp.js +++ b/partner-bnisp.js @@ -41,16 +41,12 @@ function callbackReport(requestId, rc, message, options) { aaa.callbackReportWithPushToMongoDb(requestId, rc, message); } -function topupRequest(task) { - aaa.insertTaskToMongoDb(task); - _hitTopup(task); -} - function splitRemoteProduct(remoteProduct) { return remoteProduct.replace(/^\s+|\s+$/gm,'').split(/[\/\W]+/); } -function _hitTopup(task, isCheckStatus) { +function topupRequest(task) { + aaa.insertTaskToMongoDb(task); const remoteProduct = splitRemoteProduct(task.remoteProduct); @@ -80,7 +76,7 @@ function _hitTopup(task, isCheckStatus) { if (error) { let rc = '68'; - if (!isCheckStatus && (error.syscall == 'connect')) { + if (!error.syscall == 'connect') { rc = '91'; } @@ -100,8 +96,8 @@ function _hitTopup(task, isCheckStatus) { if (!body) { let rc = '68'; - logger.warn('Error processing response body', {task: task, responseBody: body}); - callbackReport(task.requestId, rc, 'INTERNAL_MSG: Error processing response body', {task: task}); + logger.warn('Missing response body', {task: task, responseBody: body}); + callbackReport(task.requestId, rc, 'INTERNAL_MSG: Missing response body', {task: task}); return; } @@ -128,6 +124,67 @@ function _hitTopup(task, isCheckStatus) { } +function topupAdvice(task) { + + let pathParams = { + noid: config.h2h_out.noid, + token: config.h2h_out.token, + trace_id: task.requestId + } + + const requestOptions = { + url: config.h2h_out.partner.replace(/\/+$/, '') + '/' + createUrlPathAdvice(pathParams).replace(/^\/+/, ''); + } + + logger.verbose('Requeting advice to partner', {requestOptions: requestOptions}); + request(requestOptions, function(error, response, body) { + if (error) { + let rc = '68'; + + logger.warn('Error requesting to advice partner', {task: task, rc: rc, error: error}); + callbackReport(task.requestId, rc, 'INTERNAL_MSG: Error requesting advice to partner. ' + error, {task: task}); + return; + } + + if (response.statusCode != 200) { + let rc = '68'; + + logger.warn('Advice HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); + callbackReport(task.requestId, rc, 'INTERNAL_MSG: Advice HTTP status code ' + response.statusCode, {task: task}); + return; + } + + if (!body) { + let rc = '68'; + + logger.warn('Missing advice response body', {task: task, responseBody: body}); + callbackReport(task.requestId, rc, 'INTERNAL_MSG: Missing advice response body', {task: task}); + return; + } + + if (body.trim() == 'invalid specs') { + let rc = '68'; + + logger.warn('Invalid specs', {task: task, responseBody: body}); + callbackReport(task.requestId, rc, body); + return; + } + + logger.verbose('Got advice response from partner', {task: task, responseBody: body}); + + const responseData = parseResponseBody(body); + logger.verbose('Advice response body parsed as json value', {responseData: responseData}); + const data = responseDataProcessor(responseData); + + if (data.balance && aaa.updateBalance) { + aaa.updateBalance(data.balance); + } + + callbackReport(task.requestId, data.rc, data.combinedMessage, {task: task}); + }) + +} + function createUrlPath(options) { let urlPath = [ "get", @@ -146,6 +203,21 @@ function createUrlPath(options) { return '/' + urlPath; } +function createUrlPathAdvice(options) { + // pattern: /get/advice/json/[noid]/[token]/[traceid] + + let urlPath = [ + "get", + "advice", + "json", + options.noid, + options.token, + options.trace_id + ].join('/'); + + return '/' + urlPath; +} + function parseResponseBody(body) { let data; @@ -243,8 +315,10 @@ function responseDataProcessor(responseData) { } exports.start = start; +exports.topupRequest = topupRequest; +exports.topupAdvice = topupAdvice; exports.createUrlPath = createUrlPath; +exports.createUrlPathAdvice = createUrlPathAdvice; exports.parseResponseBody = parseResponseBody; exports.responseDataProcessor = responseDataProcessor; -exports.topupRequest = topupRequest; exports.splitRemoteProduct = splitRemoteProduct; diff --git a/test.js b/test.js index cdcb41d..78c74a2 100644 --- a/test.js +++ b/test.js @@ -4,6 +4,7 @@ const should = require("should"); const partner = require("./partner-bnisp"); describe("#partner", function() { + describe("#createUrlPath", function() { it('should return correct url path based on example', function() { @@ -21,6 +22,20 @@ describe("#partner", function() { }) + describe("#createUrlPathAdvice", function() { + + it('should return correct url path based on example', function() { + let options = { + noid: 1002003, + token: 'CIPY6t6ruy5UuGG0PCqu', + trace_id: 16 + } + + partner.createUrlPathAdvice(options).should.equal('/get/advice/json/1002003/CIPY6t6ruy5UuGG0PCqu/16') + }) + + }) + const responseBody = '{"trxId":"064024","response_code":"0000","response_message":"SUKSES","detail":{"jmlTagihan":"1","kodeThree":"012001","nilaiPulsa":"000000005000","noHp":"0895385381299","transactionId":"0612143023138365102 ","voucherSerialNumber":"20170612143620980249"},"reff":"20170612143620980249","loadTime":"0.0107","tipe_request":"purchase","prv":"hpay","userID":"1002003","idpel":"0895385381299","product":"PULSA","produk":"PULSA","product_detail":"THREE5000","produk_tipe":"THREE5000","traceId":16,"tagihan":5050,"total_tagihan":5050,"amount":5050,"saldo":94950,"waktu":"2017-07-17 18:43:32"}'; const responseData = partner.parseResponseBody(responseBody); -- 1.9.0