From 971dc7a2b24e98af4ac88d28c7fd746a84903e70 Mon Sep 17 00:00:00 2001 From: ChiefSoft works Date: Sun, 5 Jun 2022 04:35:33 +0000 Subject: [PATCH] Save transfer request/response to DB --- .../service/transfer.js | 230 +++++++++++------- 1 file changed, 140 insertions(+), 90 deletions(-) diff --git a/flutterwave-transfer-micro/service/transfer.js b/flutterwave-transfer-micro/service/transfer.js index a5d847d..668e490 100644 --- a/flutterwave-transfer-micro/service/transfer.js +++ b/flutterwave-transfer-micro/service/transfer.js @@ -10,96 +10,146 @@ 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); - // 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('-------------------------------'); - res.json({ - status: response.status, - statusText: response.statusText, - data: response.data - }); - }) - .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: typeof err.response !== 'undefined' ? err.response.status : null, - data: typeof err.response !== 'undefined' ? err.response.data : null - }); - }); - // 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]) - }); - }, - 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(data => { - res.json(data); - }) - .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]) - }); - } + 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 =', flutterwave_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 => { + logger.error(err.message); + //logger.error(err.stack); + //logger.error(err.response.data); + //logger.error(err.response.headers); + queryText = 'UPDATE flutterwave SET response=$1 WHERE id=$2'; + db.query(queryText, [err, 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: err.message, + 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(data => { + res.json(data); + }) + .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;