flutterwave
Version:
A nodejs library for the Flutterwave API
226 lines (191 loc) • 5.78 kB
JavaScript
var FlutterwaveUtils = require('./flw.utils');
var Request = require('request');
/**
* Flutterwave base class
*
* @class Flutterwave
* @constructor
*/
var FlutterwaveBase = function (merchant_api_key, merchant_key, base_url_or_production_flag) {
FlutterwaveUtils.emptyCheck(merchant_api_key, 'API Key required');
FlutterwaveUtils.emptyCheck(merchant_key, 'Merchant Key required');
var merchant_api_key = merchant_api_key;
var merchant_key = merchant_key;
var base_url = 'http://staging1flutterwave.co:8080/pwc/rest';
var prod_url = 'https://prod1flutterwave.co:8181/pwc/rest';
if(base_url_or_production_flag === true){
base_url = prod_url;
}
else if(typeof base_url_or_production_flag != 'undefined' && base_url_or_production_flag != ''){
base_url = base_url_or_production_flag;
}
this.getMerchantAPIKey = function () {
return merchant_api_key;
}
this.getMerchantKey = function () {
return merchant_key;
}
this.getBaseUrl = function () {
return base_url;
}
this.setBaseUrl = function (new_base_url) {
if(new_base_url){
base_url = new_base_url;
}
}
this.makeRequest = function (path, payload, callback){
var requestOptions = {};
var requestMethod = FlutterwaveUtils.initDefaultValue(payload.method, 'GET');
var datakey = requestMethod == 'POST' ? 'body' : 'qs';
var requestJSON = datakey == 'body' ? true : false;
requestOptions.uri = path;
requestOptions.baseUrl = this.getBaseUrl();
requestOptions.method = requestMethod;
requestOptions[datakey] = FlutterwaveUtils.initDefaultValue(payload.data, {});
requestOptions.json = requestJSON;
requestOptions.headers = {'Content-Type':'application/json'};
if(callback) {
this._makeRequest(requestOptions, callback);
return requestOptions;
} else {
return this._makePromiseRequest(requestOptions);
}
}
}
/**
* Send network request. Invokes callback when request is done.
*
* @param requestOptions
* @param callback
* @private
*/
FlutterwaveBase.prototype._makeRequest = function(requestOptions, callback) {
Request(requestOptions,
function (err, res, body) {
if(typeof res == "undefined"){
res = {};
}
if(typeof body == 'undefined'){
body = {};
}
res.flutterwaveRequestSuccessful = false;
res.flutterwaveRequestRequiresValidation = false;
if (body && body.data) {
var responsecode = body.data.responseCode || body.data.responsecode;
if (body.status == 'success' && ~['00', '0', '02'].indexOf(responsecode)) {
res.flutterwaveRequestSuccessful = true;
}
if (responsecode == '02') {
res.flutterwaveRequestRequiresValidation = true;
}
}
callback(err, res, body);
}
);
}
/**
* Send network request and returns a promise that is resolved when the request is done.
*
* @param requestOptions
* @returns {Promise}
* @private
*/
FlutterwaveBase.prototype._makePromiseRequest = function (requestOptions) {
var self = this;
return new Promise(function (resolve, reject) {
self._makeRequest(requestOptions, function (err, res, body) {
if (err) {
reject(err);
} else {
resolve(res, body);
}
});
});
};
FlutterwaveBase.prototype.paramCheck = function (param, fail_message) {
FlutterwaveUtils.emptyCheck(param, fail_message);
}
FlutterwaveBase.prototype.objectBuilder = function (eval_dict) {
var objectbuilder = require('./flw.objectbuilder');
return new objectbuilder(eval_dict);
}
FlutterwaveBase.prototype.decryptText = function (key) {
key = key || '';
return function (encrypted_text, key_to_use) {
key_to_use = FlutterwaveUtils.initDefaultValue(key_to_use, key);
return require('./flw.decrypt')(key_to_use, encrypted_text);
}
}
FlutterwaveBase.prototype.validateAndEncryptParams = function (params, paramDictionary, encryptKey) {
var returnParams = {}; //This is so we only take what we need no matter the amount of params passed
for( p in paramDictionary )
{
if(paramDictionary.hasOwnProperty(p))
{
if( params[p] )
{
returnParams[p] = params[p];
}
var expectedParam = paramDictionary[p];
if ( expectedParam.required == 'true' ) {
this.paramCheck(params[p], p + ' is required');
}
if( expectedParam.encrypt == 'true' && returnParams[p] ) {
returnParams[p]= require('./flw.encrypt')(encryptKey, params[p] + '');
}else {
}
}
}
return returnParams;
}
FlutterwaveBase.prototype.paramEncrypt = function (encryptKey, encryptDict, params) {
for(var p in params){
if(params.hasOwnProperty(p))
{
var param = params[p];
if( encryptDict[p].encrypt == 'true'){
params[p] = require('./flw.encrypt')(encryptKey, params[p]);
}
}
}
return params;
}
FlutterwaveBase.prototype.getCountryCodes = function () {
var codes = this.objectBuilder({}).build('NIGREIA:NG')
.build('GHANA:GH')
.build('UNITED STATES:US')
.build('KENYA:KE')
.build('UNITED KINGDOM:UK')
.end();
return codes;
}
FlutterwaveBase.prototype.getCountryCode = function (country_name) {
if(country_name && typeof country_name == 'string')
{
country_name = country_name.toUpperCase().trim();
var codes = this.getCountryCodes();
if(codes[country_name])
{
return codes[country_name];
}
}
return null;
}
FlutterwaveBase.prototype.getCurrencyCode = function (code_name) {
var currencies = this.objectBuilder({}).build('NAIRA:NGN')
.build('DOLLARS:USD')
.build('POUNDS:GBP')
.build('EURO:EURO')
.build('GHANACEDIS:GHS')
.build('KENYASHILLING:KES')
.end();
if( code_name && typeof code_name == 'string')
{
code_name = code_name.toUpperCase().trim();
if(currencies[code_name]){
return currencies[code_name];
}
}
return null;
}
module.exports = FlutterwaveBase;