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