Commit 385d8ff5945e244b3d4efaee1f68c8b54753cc7b

Authored by Adhidarma Hadiwinoto
1 parent d4661aa843
Exists in master

PREPAID topup tested

Showing 7 changed files with 158 additions and 7 deletions Side-by-side Diff

lib/callback/dumper.js
... ... @@ -35,6 +35,7 @@ module.exports = async (req, res, next) => {
35 35  
36 36 const data = `--------
37 37 XID: ${xid}
  38 +PID: ${process.pid}
38 39 DATE: ${moment().format('YYYY-MM-DD HH:mm:ss.SSS')}
39 40 REMOTE-ADDR: ${req.ip}
40 41 USER-AGENT: ${req.get('user-agent')}
... ... @@ -73,7 +74,7 @@ ${(req.body && typeof req.body === 'object' && JSON.stringify(req.body, null, 2)
73 74 );
74 75  
75 76 await fsPromise.writeFile(
76   - path.join(callbackDumpDir, 'last.trx'),
  77 + path.join(callbackDumpDir, 'last-callback'),
77 78 data,
78 79 );
79 80  
lib/callback/handler-prepaid.js
  1 +const MODULE_NAME = 'CALLBACK.HANDLER-PREPAID';
  2 +
  3 +const logger = require('komodo-sdk/logger');
  4 +const report = require('../report/prepaid');
  5 +const getFromReq = require('../get-from-params-body-qs');
  6 +const translateRc = require('../translate-rc');
  7 +
1 8 module.exports = (req, res) => {
2 9 const { xid } = res.locals;
3 10 res.json({
... ... @@ -6,4 +13,29 @@ module.exports = (req, res) => {
6 13 ts: new Date(),
7 14 xid,
8 15 });
  16 +
  17 + const rcFromRequest = getFromReq(req, 'rc');
  18 + const translatedRc = rcFromRequest && (translateRc[rcFromRequest] || rcFromRequest);
  19 + logger.verbose(`${MODULE_NAME} 2B7BE44D: RC translated`, {
  20 + xid,
  21 + rcFromRequest,
  22 + translatedRc,
  23 + });
  24 +
  25 + report(xid, {
  26 + trx_id: getFromReq(req, 'request_id'),
  27 + rc: translatedRc || '68',
  28 + sn: getFromReq(req, 'sn'),
  29 + amount: getFromReq(req, 'amount'),
  30 + balance: getFromReq(req, 'ending_balance'),
  31 + message: {
  32 + xid,
  33 + CALLBACK: {
  34 + ip: req.ip,
  35 + method: req.method,
  36 + body: req.body,
  37 + qs: req.query,
  38 + },
  39 + },
  40 + });
9 41 };
lib/get-from-params-body-qs.js
... ... @@ -0,0 +1,3 @@
  1 +module.exports = (req, keyword) => (req.params && req.params[keyword])
  2 + || (req.body && req.body[keyword])
  3 + || (req.query && req.query[keyword]);
lib/hit/dump-req-res.js
... ... @@ -0,0 +1,87 @@
  1 +const MODULE_NAME = 'DUMP-REQ-RES';
  2 +
  3 +const fs = require('fs');
  4 +const path = require('path');
  5 +const fsPromise = require('fs').promises;
  6 +const moment = require('moment');
  7 +
  8 +const config = require('komodo-sdk/config');
  9 +const logger = require('komodo-sdk/logger');
  10 +
  11 +const baseDumpDir = 'dump';
  12 +const requestDumpDir = path.join(baseDumpDir, 'request');
  13 +
  14 +if (!fs.existsSync(baseDumpDir)) {
  15 + logger.verbose(`${MODULE_NAME} 51105314: Creating base dump dir`);
  16 + fs.mkdirSync(baseDumpDir);
  17 +}
  18 +
  19 +if (!fs.existsSync(requestDumpDir)) {
  20 + logger.verbose(`${MODULE_NAME} 8A52891B: Creating request dump dir`);
  21 + fs.mkdirSync(requestDumpDir);
  22 +}
  23 +
  24 +module.exports = async (
  25 + xid, task, httpMethod, endpointUrl, params, responseBody, responseStatus,
  26 +) => {
  27 + if (
  28 + !config
  29 + || !config.partner
  30 + || !config.partner.dump_request
  31 + ) {
  32 + return;
  33 + }
  34 +
  35 + const data = `--------
  36 +XID: ${xid}
  37 +PID: ${process.pid}
  38 +DATE: ${moment().format('YYYY-MM-DD HH:mm:ss.SSS')}
  39 +
  40 +TASK:
  41 +${JSON.stringify(task, null, 2)}
  42 +
  43 +
  44 +HTTP-METHOD: ${httpMethod}
  45 +URL: ${endpointUrl}
  46 +PARAMS:
  47 +${
  48 + params && (
  49 + (typeof params === 'string' && params)
  50 + || JSON.stringify(params, null, 2)
  51 + )
  52 +}
  53 +
  54 +RESPONSE-STATUS: ${responseStatus}
  55 +RESPONSE-BODY:
  56 +${
  57 + responseBody && (
  58 + (typeof responseBody === 'string' && responseBody)
  59 + || JSON.stringify(responseBody, null, 2)
  60 + )
  61 +}
  62 +`;
  63 +
  64 + const dumpDir = path.join(
  65 + requestDumpDir,
  66 + moment().format('YYYY-MM-DD'),
  67 + );
  68 +
  69 + try {
  70 + await fsPromise.stat(dumpDir);
  71 + } catch {
  72 + await fsPromise.mkdir(dumpDir, { recursive: true });
  73 + }
  74 +
  75 + await fsPromise.writeFile(
  76 + path.join(
  77 + dumpDir,
  78 + `trx_${task.trx_id}`,
  79 + ),
  80 + data,
  81 + );
  82 +
  83 + await fsPromise.writeFile(
  84 + path.join(dumpDir, 'last-trx'),
  85 + data,
  86 + );
  87 +};
... ... @@ -10,10 +10,17 @@ const logger = require('komodo-sdk/logger');
10 10 const report = require('../report/prepaid');
11 11 const translateRc = require('../translate-rc');
12 12 const composeCallbackUrl = require('./compose-callback-url');
  13 +const dumpReqRes = require('./dump-req-res');
13 14  
14 15 module.exports = async (task, isAdvice) => {
15 16 const xid = uniqid();
16 17  
  18 + logger.verbose(`${MODULE_NAME} 2272F01F: Processing task`, {
  19 + xid,
  20 + isAdvice,
  21 + task,
  22 + });
  23 +
17 24 const params = {
18 25 request_id: task.trx_id,
19 26 terminal_name: config.partner.terminal_name,
... ... @@ -27,10 +34,11 @@ module.exports = async (task, isAdvice) => {
27 34 ? urljoin(config.partner.url, '/trx-status')
28 35 : urljoin(config.partner.url, '/topup');
29 36  
  37 + let lastResponse = null;
  38 +
30 39 try {
31 40 logger.verbose(`${MODULE_NAME} 4AAD4F99: Going to HIT prepaid endpoint`, {
32 41 xid,
33   - isAdvice,
34 42 endpointUrl,
35 43 params,
36 44 });
... ... @@ -64,6 +72,8 @@ module.exports = async (task, isAdvice) => {
64 72 throw e;
65 73 }
66 74  
  75 + lastResponse = response;
  76 +
67 77 logger.verbose(`${MODULE_NAME} E51AFBBA: Got a direct response`, {
68 78 xid,
69 79 responseBody: response.data,
... ... @@ -85,6 +95,8 @@ module.exports = async (task, isAdvice) => {
85 95 } catch (e) {
86 96 const rc = e.rc || '68';
87 97  
  98 + lastResponse = e.response;
  99 +
88 100 report(xid, {
89 101 trx_id: task.trx_id,
90 102 rc,
... ... @@ -99,5 +111,16 @@ module.exports = async (task, isAdvice) => {
99 111 'IS-ADVICE': !!isAdvice,
100 112 },
101 113 });
  114 + } finally {
  115 + dumpReqRes(
  116 + xid,
  117 + task,
  118 + 'GET',
  119 + endpointUrl,
  120 + params,
  121 + lastResponse && lastResponse.data,
  122 + lastResponse && lastResponse.status,
  123 + lastResponse,
  124 + );
102 125 }
103 126 };
lib/partner-prepaid.js
1   -// const MODULE_NAME = 'PARTNER-PREPAID';
  1 +const hit = require('./hit/prepaid');
2 2  
3   -exports.buy = () => {
4   - //
  3 +exports.buy = (task) => {
  4 + hit(task, false);
5 5 };
6 6  
7   -exports.advice = () => {
8   - //
  7 +exports.advice = (task) => {
  8 + hit(task, true);
9 9 };
1 1 module.exports = {
2 2 '00': '00',
  3 + '02': '90',
  4 + '03': '90',
  5 + '04': '90',
3 6 13: '90',
4 7 30: '40',
5 8 68: '68',
6 9 91: '90',
  10 + 92: '90',
7 11 93: '94',
8 12 96: '68',
  13 + 97: '90',
9 14 };