'use strict'; const axios = require('axios'); const request = require('request'); const db = require('../app/db') const logger = require('../app/logger'); // https://developer.flutterwave.com/reference/create-a-transfer const flutterwaveConfigBuffer = new Buffer(process.env.FLUTTERWAVE_API, 'base64'); const flutterwaveConfig = JSON.parse(flutterwaveConfigBuffer.toString('ascii')); var transfer = { create: function(req, res, next) { var url = flutterwaveConfig.BaseApiUrl + '/v3/transfers'; var headersOpt = { "Content-Type": "application/json", "Authorization": "Bearer " + flutterwaveConfig.SecretKey, }; var data = { "account_bank": req.body.account_bank, "account_number": req.body.account_number, "amount": req.body.amount, "narration": req.body.narration, "currency": req.body.currency, "reference": req.body.reference, "debit_currency": req.body.debit_currency }; var options = { headers: headersOpt }; logger.info(url); logger.info(options); logger.info(data); /* CREATE TABLE flutterwave ( id bigserial, money_transfer_id int NOT NULL REFERENCES money_transfer(id), request json NOT NULL, response json NOT NULL, created timestamp DEFAULT NOW(), PRIMARY KEY(id) ); */ // Save request in the DB var queryText = 'INSERT INTO flutterwave(money_transfer_id, request) VALUES($1, $2) RETURNING id' db.query(queryText, [req.body.money_transfer_id, data], function(dbErr, result) { if (dbErr) { logger.info('Failed to save request in the DB for money_transfer_id =', req.body.money_transfer_id); logger.info(dbErr); res.send({ status: "failure", message: "Failed to save request in the DB!", details: dbErr.message, code: null, data: data }); } else { var flutterwave_id = result.rows[0].id; logger.info('Request saved int the DB for money_transfer_id =', flutterwave_id); logger.info(result.rows); // https://blog.logrocket.com/5-ways-to-make-http-requests-in-node-js/ // https://stackoverflow.com/questions/53846709/how-do-i-use-axios-within-expressjs axios.post(url, data, options) .then(response => { //res.json(response); logger.info('-------------------------------'); logger.info(response.data); logger.info('-------------------------------'); var json = { status: response.status, statusText: response.statusText, data: response.data }; queryText = 'UPDATE flutterwave SET response=$1 WHERE id=$2'; db.query(queryText, [json, flutterwave_id], function(dbErr, result) { if (dbErr) { logger.info('Failed to save response in the DB for money_transfer_id =', flutterwave_id); logger.info(dbErr); } else { logger.info('Response saved int the DB for money_transfer_id =', flutterwave_id); logger.info('Updated row count:', result.rowCount); } }); res.json(json); }) .catch(err => { // https://stackoverflow.com/questions/45017822/catching-error-body-using-axios-post var errorMessage = err.message; logger.error(err.message); //logger.error(err.stack); //logger.error(err.response.data); //logger.error(err.response.headers); if ( err.request ) { console.log(err.request); // err.request.response errorMessage = err.request; } if( err.response ) { console.log(err.response.data); // => the response payload errorMessage = err.response.data; } queryText = 'UPDATE flutterwave SET response=$1 WHERE id=$2'; db.query(queryText, [errorMessage, flutterwave_id], function(dbErr, result) { if (dbErr) { logger.info('Failed to save error response in the DB for money_transfer_id =', flutterwave_id); logger.info(dbErr); } else { logger.info('Error response saved int the DB for money_transfer_id =', flutterwave_id); logger.info('Updated row count:', result.rowCount); } }); res.send({ status: "failure", message: "Invalid response", details: errorMessage, code: typeof err.response !== 'undefined' ? err.response.status : null, data: typeof err.response !== 'undefined' ? err.response.data : null }); }); } }); // Check DB time stamp (integrity check) db.query('SELECT NOW()', (err, res) => { if (err) { throw err; } logger.info('time:', res.rows[0]) }); }, get: function(req, res, next) { var url = flutterwaveConfig.BaseApiUrl + '/v3/transfers/' + req.params.id; var headersOpt = { "Authorization": "Bearer " + flutterwaveConfig.SecretKey, }; var options = { headers: headersOpt }; logger.info(url); axios.get(url, options) .then(response => { //res.json(response); logger.info('-------------------------------'); logger.info(response.data); logger.info('-------------------------------'); var json = { status: response.status, statusText: response.statusText, data: response.data }; res.json(json); }) .catch(err => { logger.error(err.message); //logger.error(err.stack); logger.error(err.response.data); //logger.error(err.response.headers); res.send({ status: "failure", message: "Invalid response", details: err.message, code: err.response.status, data: err.response.data }); }); // TODO: Do we save the response in the DB? I assume: YES db.query('SELECT NOW()', (err, res) => { if (err) { throw err; } logger.info('time:', res.rows[0]) }); } }; module.exports = transfer;