diff --git a/flutterwave-transfer-micro/api/controller.js b/flutterwave-transfer-micro/api/controller.js index d32c1c9..a6381b9 100644 --- a/flutterwave-transfer-micro/api/controller.js +++ b/flutterwave-transfer-micro/api/controller.js @@ -2,6 +2,7 @@ const properties = require('../package.json') const transfer = require('../service/transfer'); +const account = require('../service/account'); var controllers = { about: function(req, res) { @@ -27,6 +28,14 @@ var controllers = { res.json(dist); }); }, + verifyAccount: function(req, res) { + account.verify(req, res, function(err, dist) { + if (err) { + res.send(err); + } + res.json(dist); + }); + }, }; module.exports = controllers; diff --git a/flutterwave-transfer-micro/api/routes.js b/flutterwave-transfer-micro/api/routes.js index a5b5d63..659426e 100644 --- a/flutterwave-transfer-micro/api/routes.js +++ b/flutterwave-transfer-micro/api/routes.js @@ -3,10 +3,12 @@ const controller = require('./controller'); module.exports = function(app) { - app.route('/about') - .get(controller.about); - app.route('/create') - .post(controller.postTransfer); - app.route('/status/:id') - .get(controller.getStatus); + app.route('/about') + .get(controller.about); + app.route('/create') + .post(controller.postTransfer); + app.route('/status/:id') + .get(controller.getStatus); + app.route('/verify') + .post(controller.verifyAccount); }; diff --git a/flutterwave-transfer-micro/package.json b/flutterwave-transfer-micro/package.json index 2b35f9d..13caf73 100644 --- a/flutterwave-transfer-micro/package.json +++ b/flutterwave-transfer-micro/package.json @@ -15,6 +15,7 @@ "axios": "^0.24.0", "body-parser": "^1.19.0", "express": "^4.17.1", + "flutterwave-node-v3": "^1.0.9", "openapi-types": "^10.0.0", "pg": "8.7.1", "pg-pool": "^3.5.1", diff --git a/flutterwave-transfer-micro/service/account.js b/flutterwave-transfer-micro/service/account.js new file mode 100644 index 0000000..d9b6fa9 --- /dev/null +++ b/flutterwave-transfer-micro/service/account.js @@ -0,0 +1,128 @@ +'use strict'; + +const flutterwave = require('flutterwave-node-v3'); +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')); +/* +curl -X POST http://localhost:9086/verify \ + -H 'Content-Type: application/json' \ + -d '{"account_bank":"044","account_number":"0690000032"}' +*/ +var account = { + verify: function(req, res, next) { + const flw = new flutterwave(flutterwaveConfig.PublicKey, flutterwaveConfig.SecretKey); + const details = { + account_number: req.body.account_number, + account_bank: req.body.account_bank + }; + logger.info(details); + + /* + CREATE TABLE flutterwave_account_cache ( + id bigserial, + account_bank VARCHAR(3) NOT NULL, + account_number VARCHAR(20) NOT NULL, + response json, + created timestamp DEFAULT NOW(), + PRIMARY KEY(id) + ); + */ + // Save request in the DB + var queryText = 'INSERT INTO flutterwave_account_cache(account_bank, account_number) VALUES($1, $2) RETURNING id' + db.query(queryText, [req.body.account_bank, req.body.account_number], function(dbErr, result) { + if (dbErr) { + logger.info('Failed to save request in the DB for account_bank = %s, account_number=%s', req.body.account_bank, req.body.account_number); + logger.info(dbErr); + res.send({ + status: "failure", + message: "Failed to save request in the DB!", + details: dbErr.message, + code: null, + data: details + }); + } else { + var flutterwave_cache_id = result.rows[0].id; + logger.info('Request saved int the DB for flutterwave_account_cache_id =', flutterwave_cache_id); + logger.info(result.rows); + // https://developer.flutterwave.com/docs/verifications/bank-account/ + flw.Misc.verify_Account(details) + .then(response => { + //res.json(response); + /* + { + "status": "success", + "message": "Account details fetched", + "data": { + "account_number": "0690000032", + "account_name": "Pastor Bright" + } + } + */ + logger.info('-------------------------------'); + logger.info(response.data); + logger.info('-------------------------------'); + var json = { + status: response.status, + statusText: response.message, + data: response.data + }; + queryText = 'UPDATE flutterwave_account_cache SET response=$1 WHERE id=$2'; + db.query(queryText, [json, flutterwave_cache_id], function(dbErr, result) { + if (dbErr) { + logger.info('Failed to save response in the DB for flutterwave_account_cache_id =', flutterwave_cache_id); + logger.info(dbErr); + } else { + logger.info('Response saved int the DB for flutterwave_account_cache_id =', flutterwave_cache_id); + logger.info('Updated row count:', result.rowCount); + } + }); + res.json(json); + }) + .catch(err => { + /* + { + "status": "error", + "message": "Sorry, that account number is invalid, please check and try again", + "data": null + } + */ + logger.error(err.message); + //logger.error(err.stack); + //logger.error(err.response.data); + //logger.error(err.response.headers); + queryText = 'UPDATE flutterwave_account_cache SET response=$1 WHERE id=$2'; + db.query(queryText, [err, flutterwave_cache_id], function(dbErr, result) { + if (dbErr) { + logger.info('Failed to save error response in the DB for flutterwave_account_cache_id =', flutterwave_cache_id); + logger.info(dbErr); + } else { + logger.info('Error response saved int the DB for flutterwave_account_cache_id =', flutterwave_cache_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]) + }); + }, +}; + +module.exports = account; \ No newline at end of file