├── .DS_Store ├── .prettierrc ├── images └── logo.png ├── .gitignore ├── services ├── misc │ ├── rave.balances.js │ ├── rave.initiate.bvn.js │ ├── rave.resolve.account.js │ ├── rave.balances-currency.js │ └── rave.verify.bvn.js ├── payment-plans │ ├── rave.retrieve.all.js │ ├── rave.create.js │ ├── rave.retrieve.single.js │ ├── rave.cancel.js │ └── rave.update.js ├── transfers │ ├── rave.retrieve.transfers.js │ ├── rave.initiate.js │ ├── rave.wallet.js │ ├── rave.bulk.js │ ├── rave.fetch.js │ └── rave.fee.js ├── virtual-cards │ ├── rave.retrieve.all.cards.js │ ├── rave.create.card.js │ ├── rave.fund.js │ ├── rave.withdraw.js │ ├── rave.retrieve.single.card.js │ ├── rave.terminate.js │ ├── rave.transactions.js │ └── rave.block_unblock.js ├── subaccount │ ├── rave.fetch.all.js │ ├── rave.create.js │ ├── rave.fetch.js │ ├── rave.delete.js │ └── rave.update.js ├── settlements │ ├── rave.retrieve-all.js │ └── rave.retrieve.js ├── transactions │ ├── rave.retrieve.js │ ├── rave.refund.js │ ├── rave.resend-hooks.js │ ├── rave.verify.js │ ├── rave.events.js │ ├── rave.fee.js │ └── rave.verify-by-txref.js ├── bills │ ├── rave.get.bill-categories.js │ ├── rave.get.bill-payment-agencies.js │ ├── rave.get.recurrings-bills.js │ ├── rave.create-bill.payment.js │ ├── rave.create-bulk.bills.js │ ├── rave.get.status.js │ ├── rave.get-bill-payments.js │ ├── rave.update-bills.order.js │ ├── rave.amount.to-be-paid.js │ ├── rave.create-order-billing-code.js │ ├── rave.products-under-an-agency.js │ └── rave.validate-bill.js ├── subscriptions │ ├── rave.retrieve.all.js │ ├── rave.retrieve.single.js │ ├── rave.cancel.js │ └── rave.activate.js ├── beneficiaries │ ├── rave.retrieve.js │ ├── rave.create.js │ ├── rave.delete.js │ └── rave.single.retrieve.js ├── ebills │ ├── rave.order.js │ └── rave.update.js ├── otps │ ├── rave.create.js │ └── rave.validate.js ├── charge │ ├── encryp.js │ ├── rave.validate.js │ ├── rave.ng-banks.js │ ├── rave.ussd.js │ ├── rave.ach.js │ ├── rave.applepay.js │ ├── rave.googlepay.js │ ├── rave.enaira.js │ ├── rave.fawrypay.js │ ├── rave.uk-banks.js │ ├── rave.bank.transfer.js │ ├── rave.card.charge.js │ └── rave.voucher.js ├── tokenized-charges │ ├── rave.charge.js │ ├── rave.bulk.charge.js │ ├── rave.update.tokens.js │ ├── rave.retrieve.a.bulk.js │ └── rave.retrieve.charge.transactions.js ├── mobile-money │ ├── rave.mpesa.js │ ├── rave.ghana.js │ ├── rave.rwanda.js │ ├── rave.uganda.js │ ├── rave.zambia.js │ ├── rave.francophone.js │ └── rave.tanzania.js ├── virtual-account │ ├── rave.create.js │ ├── rave.create.bulk.js │ ├── rave.retrieve.js │ └── rave.retrieve.bulk.js ├── banks │ ├── rave.banks-country.js │ └── rave.banks-branches.js ├── rave.custom.request.js └── schema │ ├── base.js │ ├── bill.js │ └── auxillary.js ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── bug_report.md └── workflows │ ├── security-scan.yml │ ├── change-review.yml │ └── package-publish.yml ├── lib ├── rave.custom.js ├── rave.ebills.js ├── rave.banks.js ├── rave.otps.js ├── rave.settlements.js ├── rave.beneficiaries.js ├── rave.subscriptions.js ├── rave.virtual_account.js ├── rave.misc.js ├── rave.subaccount.js ├── rave.payment_plan.js ├── rave.transfers.js ├── rave.tokenized.js ├── rave.mobile_money.js ├── rave.transactions.js ├── rave.virtual_cards.js ├── rave.charge.js ├── security.js ├── rave.bills.js └── rave.base.js ├── utils ├── validator.js ├── rave.utils.js ├── error.js ├── logger.js └── build.js ├── LICENSE ├── package.json ├── test ├── rave.subscriptions.test.js ├── rave.cards.test.js ├── rave.ebills.test.js ├── rave.otp.test.js ├── rave.bank.test.js ├── rave.beneficiaries.test.js ├── rave.transactions.test.js └── rave.misc.test.js ├── index.js ├── views └── index.pug ├── documentation ├── ebills.md ├── otp.md ├── subscription.md ├── misc.md ├── beneficiary.md ├── virtualAccount.md └── payment-plan.md ├── CONTRIBUTING.md ├── README.md └── CHANGELOG.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Flutterwave/Node-v3/HEAD/.DS_Store -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Flutterwave/Node-v3/HEAD/images/logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .vscode 4 | .env 5 | .prettierrc.json 6 | .eslintrc.json -------------------------------------------------------------------------------- /services/misc/rave.balances.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch(data, `Fetch all balances`, `/v3/balances?`, _rave); 5 | } 6 | 7 | module.exports = service; 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Developer Support Forum 4 | url: https://forum.flutterwave.com 5 | about: If you're having general trouble with your integration, Kindly contact our support team. 6 | -------------------------------------------------------------------------------- /services/payment-plans/rave.retrieve.all.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch(data, `Fetch all plans`, `v3/payment-plans?`, _rave); 5 | } 6 | 7 | module.exports = service; 8 | -------------------------------------------------------------------------------- /services/transfers/rave.retrieve.transfers.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch(data, `Fetch all transfers`, `/v3/transfers?`, _rave); 5 | } 6 | 7 | module.exports = service; 8 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.retrieve.all.cards.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch(data, `Fetch all cards`, `/v3/virtual-cards?`, _rave); 5 | } 6 | module.exports = service; 7 | -------------------------------------------------------------------------------- /lib/rave.custom.js: -------------------------------------------------------------------------------- 1 | // var customRequest = require('../services/rave.custom.request'); 2 | 3 | // function Custom(RaveBase) { 4 | 5 | // this.custom = function (path, data) { 6 | 7 | // return customRequest(path, data, RaveBase); 8 | // } 9 | // } 10 | 11 | // module.exports = Custom; 12 | -------------------------------------------------------------------------------- /services/subaccount/rave.fetch.all.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch all subaccount`, 7 | `/v3/subaccounts?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/settlements/rave.retrieve-all.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch all settlements`, 7 | `v3/settlements?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/transactions/rave.retrieve.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch all transactions`, 7 | `/v3/transactions?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/bills/rave.get.bill-categories.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch bill categories`, 7 | `v3/bill-categories?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/bills/rave.get.bill-payment-agencies.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch bill payment agencies`, 7 | `v3/billers?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/subscriptions/rave.retrieve.all.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch all subscriptions`, 7 | `/v3/subscriptions?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/beneficiaries/rave.retrieve.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch all transfer beneficiaries`, 7 | `/v3/beneficiaries?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/bills/rave.get.recurrings-bills.js: -------------------------------------------------------------------------------- 1 | const { handleEmptyFetch } = require('../../utils/build'); 2 | 3 | async function service(data, _rave) { 4 | return handleEmptyFetch( 5 | data, 6 | `Fetch recurring bill payments`, 7 | `v3/recurring-bills?`, 8 | _rave, 9 | ); 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /utils/validator.js: -------------------------------------------------------------------------------- 1 | const joi = require('joi'); 2 | const { validationError } = require('./error'); 3 | 4 | exports.validator = (schema, data) => { 5 | const validation = schema.validate(data); 6 | const { _, error } = validation; 7 | 8 | if (error) { 9 | const message = error.details.map((x) => x.message); 10 | throw new validationError(message); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /lib/rave.ebills.js: -------------------------------------------------------------------------------- 1 | const order_ebills = require('../services/ebills/rave.order') 2 | const update_ebills = require('../services/ebills/rave.update') 3 | 4 | function Ebills(RaveBase) { 5 | 6 | this.order = function (data) { 7 | 8 | return order_ebills(data, RaveBase); 9 | 10 | } 11 | 12 | this.update = function (data) { 13 | 14 | return update_ebills(data, RaveBase); 15 | } 16 | 17 | } 18 | module.exports = Ebills; -------------------------------------------------------------------------------- /utils/rave.utils.js: -------------------------------------------------------------------------------- 1 | var RaveUtils = {}; 2 | 3 | 4 | RaveUtils.emptyCheck = function (value, message, error) { 5 | message = message || 'Some error occured'; 6 | error = error || Error; 7 | if (!value || typeof value == 'undefined') 8 | throw new error(message); 9 | } 10 | 11 | RaveUtils.initDefaultValue = function (value, default_value) { 12 | return value || default_value; 13 | } 14 | 15 | 16 | module.exports = RaveUtils; -------------------------------------------------------------------------------- /lib/rave.banks.js: -------------------------------------------------------------------------------- 1 | const banks_branches = require('../services/banks/rave.banks-branches') 2 | const banks_country = require('../services/banks/rave.banks-country') 3 | 4 | function Bank(RaveBase) { 5 | 6 | this.branches = function (data) { 7 | 8 | return banks_branches(data, RaveBase); 9 | } 10 | 11 | this.country = function (data) { 12 | 13 | return banks_country(data, RaveBase); 14 | 15 | } 16 | } 17 | module.exports = Bank; -------------------------------------------------------------------------------- /lib/rave.otps.js: -------------------------------------------------------------------------------- 1 | const create_otp = require('../services/otps/rave.create') 2 | const validate_otp = require('../services/otps/rave.validate') 3 | 4 | 5 | function Otp(RaveBase) { 6 | 7 | this.create = function (data) { 8 | 9 | return create_otp(data, RaveBase); 10 | 11 | } 12 | 13 | this.validate = function (data) { 14 | 15 | return validate_otp(data, RaveBase); 16 | 17 | } 18 | 19 | 20 | 21 | } 22 | module.exports = Otp; -------------------------------------------------------------------------------- /services/ebills/rave.order.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { orderSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(orderSchema, data); 7 | const { body: response } = await _rave.request(`v3/ebills`, data); 8 | // logger(`Create an ebill`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/otps/rave.create.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { createOTPSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(createOTPSchema, data); 7 | const { body: response } = await _rave.request(`v3/otps`, data); 8 | // logger(`Create OTP`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/charge/encryp.js: -------------------------------------------------------------------------------- 1 | var forge = require("node-forge"); 2 | function encrypt(key, text) { 3 | var cipher = forge.cipher.createCipher( 4 | "3DES-ECB", 5 | forge.util.createBuffer(key) 6 | ); 7 | cipher.start({ 8 | iv: "" 9 | }); 10 | cipher.update(forge.util.createBuffer(text, "utf-8")); 11 | cipher.finish(); 12 | var encrypted = cipher.output; 13 | return forge.util.encode64(encrypted.getBytes()); 14 | } 15 | 16 | module.exports = encrypt -------------------------------------------------------------------------------- /lib/rave.settlements.js: -------------------------------------------------------------------------------- 1 | const retrieve_all = require('../services/settlements/rave.retrieve-all') 2 | const retrieve = require('../services/settlements/rave.retrieve') 3 | 4 | 5 | function Settlements(RaveBase) { 6 | 7 | 8 | this.fetch_all = function (data) { 9 | 10 | return retrieve_all(data, RaveBase); 11 | 12 | } 13 | 14 | this.fetch = function (data) { 15 | 16 | return retrieve(data, RaveBase); 17 | 18 | } 19 | 20 | 21 | } 22 | module.exports = Settlements; -------------------------------------------------------------------------------- /services/bills/rave.create-bill.payment.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { createSchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(createSchema, data); 7 | const { body: response } = await _rave.request(`v3/bills`, data); 8 | // logger(`Create bill payments`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/charge/rave.validate.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { validateSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(validateSchema, data); 7 | const { body: response } = await _rave.request(`v3/validate-charge`, data); 8 | // logger(`Validate payment`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/payment-plans/rave.create.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { planSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(planSchema, data); 7 | const { body: response } = await _rave.request(`v3/payment-plans`, data); 8 | // logger(`Create a payment plan`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.create.card.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { cardSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(cardSchema, data); 7 | const { body: response } = await _rave.request(`v3/virtual-cards`, data); 8 | // logger(`Create virtual cards`, _rave); 9 | return response; 10 | } 11 | module.exports = service; 12 | -------------------------------------------------------------------------------- /services/charge/rave.ng-banks.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { bankChargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(bankChargeSchema, data); 7 | const { body: response } = await _rave.request(`v3/charges?type=mono`, data); 8 | // logger(`NG direct debit`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/charge/rave.ussd.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { ussdChargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(ussdChargeSchema, data); 7 | const { body: response } = await _rave.request(`v3/charges?type=ussd`, data); 8 | // logger(`Create USSD charge`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/subaccount/rave.create.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { subaccountSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(subaccountSchema, data); 7 | const { body: response } = await _rave.request(`v3/subaccounts`, data); 8 | // logger(`Create a subaccount`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/beneficiaries/rave.create.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { beneficiarySchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(beneficiarySchema, data); 7 | const { body: response } = await _rave.request(`v3/beneficiaries`, data); 8 | // logger(`Create beneficiary`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/bills/rave.create-bulk.bills.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { bulkCreateSchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(bulkCreateSchema, data); 7 | const { body: response } = await _rave.request(`v3/bulk-bills`, data); 8 | // logger(`Create bulk bill payments`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/tokenized-charges/rave.charge.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { tokenSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(tokenSchema, data); 7 | const { body: response } = await _rave.request(`v3/tokenized-charges`, data); 8 | // logger(`Create tokenized payments`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/misc/rave.initiate.bvn.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { initiateBVNSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(initiateBVNSchema, data); 7 | const { body: response } = await _rave.request(`v3/bvn/verifications`, data); 8 | // logger(`Initiate BVN consent`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/mobile-money/rave.mpesa.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request(`v3/charges?type=mpesa`, data); 8 | // logger(`Create ${data.currency} MoMo charge`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/transfers/rave.initiate.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { transferSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(transferSchema, data); 7 | const { body: response } = await _rave.request(`v3/transfers`, data); 8 | // logger(`Initiate ${data.currency} transfers`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/transfers/rave.wallet.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { walletTransferSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(walletTransferSchema, data); 7 | const { body: response } = await _rave.request(`v3/transfers`, data); 8 | // logger(`Initiate interwallet transfers`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/charge/rave.ach.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { chargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(chargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=ach_payment`, 9 | data, 10 | ); 11 | // logger(`Create ACH charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/subscriptions/rave.retrieve.single.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { listSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request(`v3/subscriptions?`, data); 9 | // logger(`Fetch a subscription`, _rave); 10 | return response; 11 | } 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /utils/error.js: -------------------------------------------------------------------------------- 1 | const { errorLog } = require('./logger'); 2 | 3 | class validationError extends Error { 4 | constructor(message) { 5 | super(message); 6 | this.name = this.constructor.name; 7 | Error.captureStackTrace(this, this.constructor); 8 | } 9 | } 10 | 11 | const getErrorMessage = (err) => { 12 | if (err instanceof validationError) { 13 | return err.message; 14 | } else { 15 | errorLog.error(err.message, err); 16 | } 17 | }; 18 | 19 | module.exports = { validationError }; 20 | -------------------------------------------------------------------------------- /services/charge/rave.applepay.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { chargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(chargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=applepay`, 9 | data, 10 | ); 11 | // logger(`Create ApplePay charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/charge/rave.googlepay.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { chargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(chargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=googlepay`, 9 | data, 10 | ); 11 | // logger(`Create GooglePay charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/charge/rave.enaira.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { eNairaChargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(eNairaChargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=enaira`, 9 | data, 10 | ); 11 | // logger(`Create eNaira charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/charge/rave.fawrypay.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { bankChargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(bankChargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=fawry_pay`, 9 | data, 10 | ); 11 | // logger(`Create FawryPay charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/charge/rave.uk-banks.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { bankChargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(bankChargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=account-ach-uk`, 9 | data, 10 | ); 11 | // logger(`UK direct debit`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/otps/rave.validate.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { validateSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(validateSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/otps/${data.reference}/validate`, 9 | data, 10 | ); 11 | // logger(`Validate OTP`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.fund.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fundSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(fundSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/virtual-cards/${data.id}/fund`, 9 | data, 10 | ); 11 | // logger(`Fund a virtual card`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/misc/rave.resolve.account.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { resolveSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(resolveSchema, data); 7 | data.method = 'POST'; 8 | const { body: response } = await _rave.request(`v3/accounts/resolve`, data); 9 | // logger(`Resolve bank account details`, _rave); 10 | return response; 11 | } 12 | 13 | module.exports = service; 14 | -------------------------------------------------------------------------------- /services/virtual-account/rave.create.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { accountSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(accountSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/virtual-account-numbers`, 9 | data, 10 | ); 11 | // logger(`Create a virtual account`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/charge/rave.bank.transfer.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { chargeSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(chargeSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=bank_transfer`, 9 | data, 10 | ); 11 | // logger(`Create Bank transfer charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/transfers/rave.bulk.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { createBulkTransferSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(createBulkTransferSchema, data); 7 | const { body: response } = await _rave.request(`v3/bulk-transfers`, data); 8 | // logger(`Initiate bulk ${data.bulk_data.currency} transfers`, _rave); 9 | return response; 10 | } 11 | 12 | module.exports = service; 13 | -------------------------------------------------------------------------------- /services/mobile-money/rave.ghana.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request( 8 | `/v3/charges?type=mobile_money_ghana`, 9 | data, 10 | ); 11 | // logger(`Create ${data.currency} MoMo charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/mobile-money/rave.rwanda.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=mobile_money_rwanda`, 9 | data, 10 | ); 11 | // logger(`Create ${data.currency} MoMo charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/mobile-money/rave.uganda.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=mobile_money_uganda`, 9 | data, 10 | ); 11 | // logger(`Create ${data.currency} MoMo charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/mobile-money/rave.zambia.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=mobile_money_zambia`, 9 | data, 10 | ); 11 | // logger(`Create ${data.currency} MoMo charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/subaccount/rave.fetch.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `/v3/subaccounts/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Fetch a subaccount`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/mobile-money/rave.francophone.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=mobile_money_franco`, 9 | data, 10 | ); 11 | // logger(`Create ${data.currency} MoMo charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/mobile-money/rave.tanzania.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { momoSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(momoSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/charges?type=mobile_money_tanzania`, 9 | data, 10 | ); 11 | // logger(`Create ${data.currency} MoMo charge`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/settlements/rave.retrieve.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { listSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `/v3/settlements/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Fetch a settlement`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/subaccount/rave.delete.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'DELETE'; 8 | const { body: response } = await _rave.request( 9 | `/v3/subaccounts/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Delete a subaccount`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/subaccount/rave.update.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { listSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `/v3/subaccounts/${data.id}`, 10 | data, 11 | ); 12 | // logger(`update subaccount details`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/tokenized-charges/rave.bulk.charge.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { bulkTokenSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(bulkTokenSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/bulk-tokenized-charges`, 9 | data, 10 | ); 11 | // logger(`Create bulk tokenized payments`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/virtual-account/rave.create.bulk.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { bulkAccountSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(bulkAccountSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/bulk-virtual-account-numbers`, 9 | data, 10 | ); 11 | // logger(`Create bulk accounts`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/beneficiaries/rave.delete.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `/v3/beneficiaries/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Delete a beneficiary`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/bills/rave.get.status.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchStatusSchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchStatusSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/bills/${data.reference}`, 10 | data, 11 | ); 12 | // logger(`Fetch bill status`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/ebills/rave.update.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { updateSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(updateSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/ebills/${data.reference}`, 10 | data, 11 | ); 12 | // logger(`Update ebills details`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/payment-plans/rave.retrieve.single.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `/v3/payment-plans/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Fetch a plan`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.withdraw.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { withdrawalSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(withdrawalSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/virtual-cards/${data.id}/withdraw`, 9 | data, 10 | ); 11 | // logger(`Virtual card withdrawals`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/payment-plans/rave.cancel.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/payment-plans/${data.id}/cancel`, 10 | data, 11 | ); 12 | // logger(`Cancel a payment plan`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/subscriptions/rave.cancel.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/subscriptions/${data.id}/cancel`, 10 | data, 11 | ); 12 | // logger(`Cancel a subscription`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/transactions/rave.refund.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { refundSchema } = require('../schema/create'); 4 | 5 | async function service(data, _rave) { 6 | validator(refundSchema, data); 7 | data.method = 'POST'; 8 | const { body: response } = await _rave.request( 9 | `v3/transactions/${data.id}/refund`, 10 | data, 11 | ); 12 | // logger(`Initiate a refund`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/bills/rave.get-bill-payments.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { listSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/bills?from=${data.from}&to=${data.to}`, 10 | data, 11 | ); 12 | // logger(`Fetch bill payments`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/payment-plans/rave.update.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { updatePlanSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(updatePlanSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/payment-plans/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Update plan details`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/subscriptions/rave.activate.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/subscriptions/${data.id}/activate`, 10 | data, 11 | ); 12 | // logger(`Activate a subscription`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/beneficiaries/rave.single.retrieve.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `/v3/beneficiaries/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Fetch a transfer beneficiary`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/transactions/rave.resend-hooks.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'POST'; 8 | const { body: response } = await _rave.request( 9 | `v3/transactions/${data.id}/resend-hook`, 10 | data, 11 | ); 12 | // logger(`Resend failed webhooks`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.retrieve.single.card.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `/v3/virtual-cards/${data.id}`, 10 | data, 11 | ); 12 | // logger(`Fetch a virtual card`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.terminate.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `/v3/virtual-cards/${data.id}/terminate`, 10 | data, 11 | ); 12 | // logger(`Delete a virtual card`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/bills/rave.update-bills.order.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { updateOrderSchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(updateOrderSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/product-orders/${data.reference}`, 10 | data, 11 | ); 12 | // logger(`Update bill order`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/tokenized-charges/rave.update.tokens.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { updateTokenSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(updateTokenSchema, data); 7 | data.method = 'PUT'; 8 | const { body: response } = await _rave.request( 9 | `v3/tokens/${data.token}`, 10 | data, 11 | ); 12 | // logger(`Update card token`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/transfers/rave.fetch.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `/v3/transfers/${data.id}`, 11 | data, 12 | ); 13 | // logger(`Fetch a transfer`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.transactions.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { listSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/virtual-cards/${data.id}/transactions?`, 10 | data, 11 | ); 12 | // logger(`Fetch card transactions`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/banks/rave.banks-country.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { listSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/banks/${data.country}`, 11 | data, 12 | ); 13 | // logger(`Get banks by country`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/banks/rave.banks-branches.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/banks/${data.id}/branches`, 11 | data, 12 | ); 13 | // logger(`Get bank branches`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/bills/rave.amount.to-be-paid.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { amountQuerySchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(amountQuerySchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/billers/${data.id}/products/${data.product_id}`, 10 | data, 11 | ); 12 | // logger(`Fetch bill amount`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/bills/rave.create-order-billing-code.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { createOrderSchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(createOrderSchema, data); 7 | const { body: response } = await _rave.request( 8 | `v3/billers/${data.id}/products/${data.product_id}/orders`, 9 | data, 10 | ); 11 | // logger(`Create order with billing code`, _rave); 12 | return response; 13 | } 14 | 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/tokenized-charges/rave.retrieve.a.bulk.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { retrieveSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(retrieveSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/bulk-tokenized-charges/${data.bulk_id}`, 10 | data, 11 | ); 12 | // logger(`Bulk tokenized status`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/transactions/rave.verify.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/transactions/${data.id}/verify`, 11 | data, 12 | ); 13 | // logger(`Verify Transactions`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/transactions/rave.events.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `/v3/transactions/${data.id}/events`, 11 | data, 12 | ); 13 | // logger(`View transaction events`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/misc/rave.balances-currency.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchBalance } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchBalance, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `/v3/balances/${data.currency}`, 11 | data, 12 | ); 13 | // logger(`Query balance by currency`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/virtual-account/rave.retrieve.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchAccountSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchAccountSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/bulk-virtual-account-numbers/${data.order_ref}`, 10 | data, 11 | ); 12 | // logger(`Fetch account details`, _rave); 13 | return response; 14 | } 15 | 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/bills/rave.products-under-an-agency.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchSchema } = require('../schema/base'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/billers/${data.id}/products`, 11 | data, 12 | ); 13 | // logger(`Retrieve bills by agency`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/misc/rave.verify.bvn.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { verifyBVNSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(verifyBVNSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/bvn/verifications/${data.reference}`, 11 | data, 12 | ); 13 | // logger(`Verify BVN consent`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/transactions/rave.fee.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { feeSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(feeSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/transactions/fee?amount=${data.amount}¤cy=${data.currency}`, 11 | data, 12 | ); 13 | // logger(`Create OTP`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/tokenized-charges/rave.retrieve.charge.transactions.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { retrieveSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(retrieveSchema, data); 7 | data.method = 'GET'; 8 | const { body: response } = await _rave.request( 9 | `v3/bulk-tokenized-charges/${data.bulk_id}/transactions`, 10 | data, 11 | ); 12 | // logger(`Fetch bulk tokenized payments`, _rave); 13 | return response; 14 | } 15 | module.exports = service; 16 | -------------------------------------------------------------------------------- /services/transactions/rave.verify-by-txref.js: -------------------------------------------------------------------------------- 1 | const { listSchema } = require('../schema/base'); 2 | // const { logger } = require('../../utils/logger'); 3 | const { validator } = require('../../utils/validator'); 4 | 5 | async function service(data, _rave) { 6 | validator(listSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/transactions/verify_by_reference?tx_ref=${data.tx_ref}`, 11 | data, 12 | ); 13 | // logger(`Verify Transactions by tx_ref`, _rave); 14 | return response; 15 | } 16 | module.exports = service; 17 | -------------------------------------------------------------------------------- /services/bills/rave.validate-bill.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { validateSchema } = require('../schema/bill'); 4 | 5 | async function service(data, _rave) { 6 | validator(validateSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/bill-items/${data.item_code}/validate?code=${data.code}&customer=${data.customer}`, 11 | data, 12 | ); 13 | // logger(`Validate bill payment`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/virtual-account/rave.retrieve.bulk.js: -------------------------------------------------------------------------------- 1 | // const { logger } = require('../../utils/logger'); 2 | const { validator } = require('../../utils/validator'); 3 | const { fetchBulkAccountSchema } = require('../schema/auxillary'); 4 | 5 | async function service(data, _rave) { 6 | validator(fetchBulkAccountSchema, data); 7 | data.method = 'GET'; 8 | data.excludeQuery = true; 9 | const { body: response } = await _rave.request( 10 | `v3/bulk-virtual-account-numbers/${data.batch_id}`, 11 | data, 12 | ); 13 | // logger(`Fetch bulk account details`, _rave); 14 | return response; 15 | } 16 | 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/transfers/rave.fee.js: -------------------------------------------------------------------------------- 1 | const { listSchema } = require('../schema/base'); 2 | // const { logger } = require('../../utils/logger'); 3 | const { validator } = require('../../utils/validator'); 4 | // const enforceRequired = require('../../utils/build'); 5 | 6 | async function service(data, _rave) { 7 | validator(listSchema, data); 8 | data.method = 'GET'; 9 | data.excludeQuery = true; 10 | const { body: response } = await _rave.request( 11 | `v3/transfers/fee?currency=${data.currency}&amount=${data.amount}`, 12 | data, 13 | ); 14 | // logger(`Fetch transfer fees`, _rave); 15 | return response; 16 | } 17 | module.exports = service; 18 | -------------------------------------------------------------------------------- /services/rave.custom.request.js: -------------------------------------------------------------------------------- 1 | // var morx = require('morx'); 2 | 3 | // var q = require('q'); 4 | 5 | // function newRefund(path, data, _rave) { 6 | // var d = q.defer(); 7 | 8 | // q.fcall(() => { 9 | // path = path || 'NO PATH PASSED, PLEASE PASS A VALID PATH'; 10 | 11 | // if (path == 'NO PATH PASSED, PLEASE PASS A VALID PATH') { 12 | // throw path; 13 | // } 14 | 15 | // return _rave.request(path, data); 16 | // }) 17 | // .then((response) => { 18 | // d.resolve(response); 19 | // }) 20 | // .catch((err) => { 21 | // d.reject(err); 22 | // }); 23 | 24 | // return d.promise; 25 | // } 26 | 27 | // module.exports = newRefund; 28 | -------------------------------------------------------------------------------- /services/virtual-cards/rave.block_unblock.js: -------------------------------------------------------------------------------- 1 | const joi = require('joi'); 2 | // const { logger } = require('../../utils/logger'); 3 | const { validator } = require('../../utils/validator'); 4 | 5 | const spec = joi.object({ 6 | id: joi.string().required(), 7 | status_action: joi.string().valid('block', 'unblock').required(), 8 | }); 9 | 10 | async function service(data, _rave) { 11 | validator(spec, data); 12 | data.method = 'PUT'; 13 | const { body: response } = await _rave.request( 14 | `v3/virtual-cards/${data.id}/status/${data.status_action}`, 15 | data, 16 | ); 17 | // logger(`Fund a virtual card`, _rave); 18 | return response; 19 | } 20 | module.exports = service; 21 | -------------------------------------------------------------------------------- /services/charge/rave.card.charge.js: -------------------------------------------------------------------------------- 1 | const encrypt = require('./encryp'); 2 | // const { logger } = require('../../utils/logger'); 3 | const { validator } = require('../../utils/validator'); 4 | const { cardChargeSchema } = require('../schema/create'); 5 | 6 | async function service(data, _rave) { 7 | validator(cardChargeSchema, data); 8 | 9 | var encrypted = encrypt(data.enckey, JSON.stringify(data)); 10 | var payload = {}; 11 | payload.public_key = _rave.getPublicKey(); 12 | payload.client = encrypted; 13 | 14 | const { body: response } = await _rave.request( 15 | `v3/charges?type=card`, 16 | payload, 17 | ); 18 | 19 | // logger(`Create card charge`, _rave); 20 | return response; 21 | } 22 | module.exports = service; 23 | -------------------------------------------------------------------------------- /lib/rave.beneficiaries.js: -------------------------------------------------------------------------------- 1 | const create_beneficiary = require('../services/beneficiaries/rave.create'); 2 | const del_beneficiary = require('../services/beneficiaries/rave.delete'); 3 | const retrieve_all = require('../services/beneficiaries/rave.retrieve'); 4 | const retrieve = require('../services/beneficiaries/rave.single.retrieve'); 5 | 6 | function Beneficiaries(RaveBase) { 7 | this.create = function (data) { 8 | return create_beneficiary(data, RaveBase); 9 | }; 10 | 11 | this.delete = function (data) { 12 | return del_beneficiary(data, RaveBase); 13 | }; 14 | this.fetch_all = function (data) { 15 | return retrieve_all(data, RaveBase); 16 | }; 17 | this.fetch = function (data) { 18 | return retrieve(data, RaveBase); 19 | }; 20 | } 21 | module.exports = Beneficiaries; 22 | -------------------------------------------------------------------------------- /lib/rave.subscriptions.js: -------------------------------------------------------------------------------- 1 | const activate_sub = require('../services/subscriptions/rave.activate') 2 | const cancel_sub = require('../services/subscriptions/rave.cancel') 3 | const retrieve_all = require('../services/subscriptions/rave.retrieve.all') 4 | const fetch_one = require('../services/subscriptions/rave.retrieve.single') 5 | 6 | 7 | function Subscriptions(RaveBase) { 8 | 9 | 10 | this.activate = function (data) { 11 | 12 | return activate_sub(data, RaveBase); 13 | 14 | } 15 | 16 | this.cancel = function (data) { 17 | 18 | return cancel_sub(data, RaveBase); 19 | 20 | } 21 | 22 | this.fetch_all = function (data) { 23 | 24 | return retrieve_all(data, RaveBase); 25 | 26 | } 27 | 28 | this.get = function (data) { 29 | 30 | return fetch_one(data, RaveBase); 31 | 32 | } 33 | 34 | } 35 | module.exports = Subscriptions; -------------------------------------------------------------------------------- /.github/workflows/security-scan.yml: -------------------------------------------------------------------------------- 1 | name: Security scan on all changes (Commits/PRs) 2 | 3 | on: 4 | push: 5 | branches: ['main', 'master', 'pilots', 'dev'] 6 | pull_request: 7 | types: 8 | - opened 9 | 10 | jobs: 11 | code-check: 12 | runs-on: ubuntu-latest 13 | env: 14 | OS: ubuntu-latest 15 | steps: 16 | - name: checkout code 17 | uses: actions/checkout@v2 18 | 19 | - name: Checkmarx One ClI Action 20 | uses: checkmarx/ast-github-action@main 21 | with: 22 | project_name: Node-v3 23 | cx_tenant: Flutterwave 24 | base_uri: https://eu.ast.checkmarx.net/ 25 | cx_client_id: ${{ secrets.CX_CLIENT_ID }} 26 | cx_client_secret: ${{ secrets.CX_CLIENT_SECRET }} 27 | additional_params: --scan-types sast,iac-security,api-security,sca,container-security 28 | -------------------------------------------------------------------------------- /lib/rave.virtual_account.js: -------------------------------------------------------------------------------- 1 | const create_bulk_account = require('../services/virtual-account/rave.create.bulk') 2 | const initiate = require('../services/virtual-account/rave.create') 3 | const retrieve = require('../services/virtual-account/rave.retrieve') 4 | const retrieve_bulk = require('../services/virtual-account/rave.retrieve.bulk') 5 | 6 | 7 | 8 | function Virtual_account(RaveBase) { 9 | 10 | 11 | this.create_bulk = function (data) { 12 | 13 | return create_bulk_account(data, RaveBase); 14 | 15 | } 16 | this.create = function (data) { 17 | 18 | return initiate(data, RaveBase); 19 | 20 | } 21 | 22 | this.fetch = function (data) { 23 | 24 | return retrieve(data, RaveBase); 25 | 26 | } 27 | 28 | this.fetch_bulk = function (data) { 29 | 30 | return retrieve_bulk(data, RaveBase); 31 | 32 | } 33 | 34 | 35 | 36 | } 37 | module.exports = Virtual_account; -------------------------------------------------------------------------------- /lib/rave.misc.js: -------------------------------------------------------------------------------- 1 | const balances_currency = require('../services/misc/rave.balances-currency'); 2 | const get_bal = require('../services/misc/rave.balances'); 3 | const initBVN = require('../services/misc/rave.initiate.bvn'); 4 | const verifBVN = require('../services/misc/rave.verify.bvn') 5 | const resolve_act = require('../services/misc/rave.resolve.account'); 6 | 7 | function Misc(RaveBase) { 8 | this.bal_currency = function (data) { 9 | return balances_currency(data, RaveBase); 10 | }; 11 | 12 | this.bal = function (data) { 13 | return get_bal(data, RaveBase); 14 | }; 15 | 16 | this.bvn = function (data) { 17 | return initBVN(data, RaveBase); 18 | }; 19 | 20 | this.verifybvn = function (data) { 21 | return verifBVN(data, RaveBase); 22 | } 23 | 24 | this.verify_Account = function (data) { 25 | return resolve_act(data, RaveBase); 26 | }; 27 | } 28 | module.exports = Misc; 29 | -------------------------------------------------------------------------------- /lib/rave.subaccount.js: -------------------------------------------------------------------------------- 1 | const create_sub = require('../services/subaccount/rave.create') 2 | const del_sub = require('../services/subaccount/rave.delete') 3 | const get_all = require('../services/subaccount/rave.fetch.all') 4 | const get = require('../services/subaccount/rave.fetch') 5 | const update_sub = require('../services/subaccount/rave.update') 6 | 7 | function Subaccount(RaveBase) { 8 | 9 | 10 | this.create = function (data) { 11 | 12 | return create_sub(data, RaveBase); 13 | 14 | } 15 | 16 | this.delete = function (data) { 17 | 18 | return del_sub(data, RaveBase); 19 | 20 | } 21 | 22 | this.fetch_all = function (data) { 23 | 24 | return get_all(data, RaveBase); 25 | 26 | } 27 | 28 | this.fetch = function (data) { 29 | 30 | return get(data, RaveBase); 31 | 32 | } 33 | 34 | this.update = function (data) { 35 | 36 | return update_sub(data, RaveBase); 37 | 38 | } 39 | 40 | 41 | 42 | } 43 | module.exports = Subaccount; -------------------------------------------------------------------------------- /utils/logger.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const packageJson = require('../package.json'); 3 | const { createLogger, format, transports } = require('winston'); 4 | const { combine, timestamp, colorize, errors, printf, json } = format; 5 | 6 | // function logger(name, _rave) { 7 | // axios.post( 8 | // 'https://kgelfdz7mf.execute-api.us-east-1.amazonaws.com/staging/sendevent', 9 | // { 10 | // publicKey: _rave.getPublicKey(), 11 | // language: 'NodeJs v3', 12 | // version: packageJson.version, 13 | // title: 'Incoming call', 14 | // message: name, 15 | // }, 16 | // ); 17 | // } 18 | 19 | const errorLogger = createLogger({ 20 | transports: [ 21 | new transports.Console({ 22 | format: combine( 23 | errors({ 24 | stack: true, 25 | }), 26 | timestamp(), 27 | json(), 28 | ), 29 | }), 30 | ], 31 | }); 32 | 33 | module.exports = { errorLog: errorLogger }; 34 | -------------------------------------------------------------------------------- /lib/rave.payment_plan.js: -------------------------------------------------------------------------------- 1 | const create_plan = require('../services/payment-plans/rave.create') 2 | const cancel_plan = require('../services/payment-plans/rave.cancel') 3 | const retrieve_all = require('../services/payment-plans/rave.retrieve.all') 4 | const retrieve_single = require('../services/payment-plans/rave.retrieve.single') 5 | const update_plan = require('../services/payment-plans/rave.update') 6 | 7 | 8 | 9 | function Payment_plan(RaveBase) { 10 | 11 | 12 | this.create = function (data) { 13 | 14 | return create_plan(data, RaveBase); 15 | 16 | } 17 | 18 | this.cancel = function (data) { 19 | 20 | return cancel_plan(data, RaveBase); 21 | 22 | } 23 | this.get_all = function (data) { 24 | 25 | return retrieve_all(data, RaveBase); 26 | 27 | } 28 | this.get_plan = function (data) { 29 | 30 | return retrieve_single(data, RaveBase); 31 | 32 | } 33 | this.update = function (data) { 34 | 35 | return update_plan(data, RaveBase); 36 | 37 | } 38 | 39 | } 40 | module.exports = Payment_plan; -------------------------------------------------------------------------------- /lib/rave.transfers.js: -------------------------------------------------------------------------------- 1 | const bulk_transfer = require('../services/transfers/rave.bulk'); 2 | const fee_transfer = require('../services/transfers/rave.fee'); 3 | const initiate_transfer = require('../services/transfers/rave.initiate'); 4 | const fetch_transfers = require('../services/transfers/rave.retrieve.transfers'); 5 | const getATransfer = require('../services/transfers/rave.fetch'); 6 | const wallet = require('../services/transfers/rave.wallet'); 7 | 8 | function Transfers(RaveBase) { 9 | this.bulk = function (data) { 10 | return bulk_transfer(data, RaveBase); 11 | }; 12 | 13 | this.fee = function (data) { 14 | return fee_transfer(data, RaveBase); 15 | }; 16 | this.initiate = function (data) { 17 | return initiate_transfer(data, RaveBase); 18 | }; 19 | this.fetch = function (data) { 20 | return fetch_transfers(data, RaveBase); 21 | }; 22 | this.get_a_transfer = function (data) { 23 | return getATransfer(data, RaveBase); 24 | }; 25 | this.wallet_to_wallet = function (data) { 26 | return wallet(data, RaveBase); 27 | }; 28 | } 29 | module.exports = Transfers; 30 | -------------------------------------------------------------------------------- /lib/rave.tokenized.js: -------------------------------------------------------------------------------- 1 | const bulk_charge = require('../services/tokenized-charges/rave.bulk.charge') 2 | const charge_token = require('../services/tokenized-charges/rave.charge') 3 | const retrieve_a_bulk = require('../services/tokenized-charges/rave.retrieve.a.bulk') 4 | const retrieve_charge_trans = require('../services/tokenized-charges/rave.retrieve.charge.transactions') 5 | const update_a_token = require('../services/tokenized-charges/rave.update.tokens') 6 | 7 | 8 | 9 | 10 | function Tokenized(RaveBase) { 11 | 12 | 13 | this.charge = function (data) { 14 | 15 | return charge_token(data, RaveBase); 16 | 17 | } 18 | this.fetch_bulk = function (data) { 19 | 20 | return retrieve_a_bulk(data, RaveBase); 21 | 22 | } 23 | 24 | this.bulk = function (data) { 25 | 26 | return bulk_charge(data, RaveBase); 27 | 28 | } 29 | 30 | this.fetch_charge_transactions = function (data) { 31 | 32 | return retrieve_charge_trans(data, RaveBase); 33 | 34 | } 35 | 36 | 37 | this.update_token = function (data) { 38 | 39 | return update_a_token(data, RaveBase); 40 | 41 | } 42 | 43 | 44 | 45 | } 46 | module.exports = Tokenized; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Flutterwave 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/rave.mobile_money.js: -------------------------------------------------------------------------------- 1 | const gh = require('../services/mobile-money/rave.ghana'); 2 | const mpesa_money = require('../services/mobile-money/rave.mpesa'); 3 | const rw = require('../services/mobile-money/rave.rwanda'); 4 | const ug = require('../services/mobile-money/rave.uganda'); 5 | const zm = require('../services/mobile-money/rave.zambia'); 6 | const franc = require('../services/mobile-money/rave.francophone'); 7 | const tz = require('../services/mobile-money/rave.tanzania') 8 | 9 | function Mobile_money(RaveBase) { 10 | this.ghana = function (data) { 11 | return gh(data, RaveBase); 12 | }; 13 | 14 | this.mpesa = function (data) { 15 | return mpesa_money(data, RaveBase); 16 | }; 17 | 18 | this.rwanda = function (data) { 19 | return rw(data, RaveBase); 20 | }; 21 | 22 | this.uganda = function (data) { 23 | return ug(data, RaveBase); 24 | }; 25 | this.franco_phone = function (data) { 26 | return franc(data, RaveBase); 27 | }; 28 | 29 | this.zambia = function (data) { 30 | return zm(data, RaveBase); 31 | }; 32 | 33 | this.tanzania = function (data) { 34 | return tz(data, RaveBase); 35 | } 36 | } 37 | module.exports = Mobile_money; 38 | -------------------------------------------------------------------------------- /lib/rave.transactions.js: -------------------------------------------------------------------------------- 1 | const event_trans = require('../services/transactions/rave.events'); 2 | const fee_trans = require('../services/transactions/rave.fee'); 3 | const refund_trans = require('../services/transactions/rave.refund'); 4 | const resend_hooks_trans = require('../services/transactions/rave.resend-hooks'); 5 | const retrieve_trans = require('../services/transactions/rave.retrieve'); 6 | const verify_trans = require('../services/transactions/rave.verify'); 7 | const verify_trans_tx = require('../services/transactions/rave.verify-by-txref'); 8 | 9 | function Transactions(RaveBase) { 10 | this.event = function (data) { 11 | return event_trans(data, RaveBase); 12 | }; 13 | 14 | this.fee = function (data) { 15 | return fee_trans(data, RaveBase); 16 | }; 17 | 18 | this.refund = function (data) { 19 | return refund_trans(data, RaveBase); 20 | }; 21 | 22 | this.resend_hooks = function (data) { 23 | return resend_hooks_trans(data, RaveBase); 24 | }; 25 | 26 | this.fetch = function (data) { 27 | return retrieve_trans(data, RaveBase); 28 | }; 29 | 30 | this.verify = function (data) { 31 | return verify_trans(data, RaveBase); 32 | }; 33 | 34 | this.verify_by_tx = function (data) { 35 | return verify_trans_tx(data, RaveBase); 36 | } 37 | } 38 | module.exports = Transactions; 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Have you read our [Code of Conduct](https://github.com/Flutterwave/Python/blob/master/CONTRIBUTING.md)? By filing an Issue, you are expected to comply with it, including treating everyone with respect. 11 | 12 | # Description 13 | 14 | 15 | # Steps to Reproduce 16 | 17 | 1. 18 | 2. 19 | 3. 20 | 21 | ## Expected behaviour 22 | 23 | 24 | ## Actual behaviour 25 | 26 | 27 | ## Reproduces how often 28 | 29 | 30 | # Configuration 31 | - API Version: 32 | - Environment: 33 | - Browser: 34 | - Language: 35 | 36 | # Additional Information 37 | 38 | -------------------------------------------------------------------------------- /.github/workflows/change-review.yml: -------------------------------------------------------------------------------- 1 | name: Review changes on Dev (Commits/PRs) 2 | on: 3 | push: 4 | branches: ['dev'] 5 | pull_request: 6 | types: 7 | - opened 8 | 9 | jobs: 10 | code-check: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 18 17 | 18 | - uses: actions/checkout@v4 19 | 20 | - name: 'Cache node_modules' 21 | uses: actions/cache@v4 22 | with: 23 | path: ~/.npm 24 | key: ${{ runner.os }}-node-v18-${{ hashFiles('**/package-lock.json') }} 25 | restore-keys: | 26 | ${{ runner.os }}-node-v18- 27 | 28 | - name: Install Dependencies 29 | run: | 30 | npm install 31 | 32 | - name: run unit tests and coverage scan 33 | env: 34 | PUBLIC_KEY: ${{ secrets.PUBLIC_KEY }} 35 | SECRET_KEY: ${{ secrets.SECRET_KEY }} 36 | run: npm run coverage 37 | 38 | - name: upload coverage report to codecov 39 | uses: codecov/codecov-action@v4 40 | 41 | - name: push build status to Slack 42 | uses: 8398a7/action-slack@v3 43 | with: 44 | status: ${{ job.status }} 45 | fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest 46 | env: 47 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} 48 | MATRIX_CONTEXT: ${{ toJson(matrix) }} 49 | if: always() 50 | -------------------------------------------------------------------------------- /utils/build.js: -------------------------------------------------------------------------------- 1 | const joi = require('joi'); 2 | const { listSchema } = require('../services/schema/base'); 3 | // const { logger } = require('./logger'); 4 | const { validator } = require('./validator'); 5 | 6 | // make parameter required in the listSchema 7 | function enforceRequired(schema, paramList) { 8 | if (!Array.isArray(paramList)) { 9 | throw new Error('paramList must be an array'); 10 | } 11 | // params.forEach((param) => {}); 12 | paramList.map((param) => { 13 | schema.keys({ 14 | [param]: schema._ids._byKey[param].rules.concat( 15 | joi 16 | .string() 17 | .required() 18 | .messages({ 19 | 'any.required': `${param} is required!`, 20 | }), 21 | ), 22 | }); 23 | }); 24 | return schema; 25 | } 26 | 27 | // Graciously handle fetch queries with empty payload 28 | async function handleEmptyFetch(param, name, uri, _rave) { 29 | if (param === undefined || param === null) { 30 | param = {}; 31 | param.method = 'GET'; 32 | 33 | const response = await _rave.request(uri, param); 34 | 35 | const responseBody = response.body || response; 36 | 37 | // logger(name, _rave); 38 | return responseBody; 39 | } 40 | 41 | validator(listSchema, param); 42 | param.method = 'GET'; 43 | 44 | const response = await _rave.request(uri, param); 45 | const responseBody = response.body || response; 46 | 47 | // logger(name, _rave); 48 | return responseBody; 49 | } 50 | 51 | module.exports = { enforceRequired, handleEmptyFetch }; 52 | -------------------------------------------------------------------------------- /lib/rave.virtual_cards.js: -------------------------------------------------------------------------------- 1 | const create_Card = require('../services/virtual-cards/rave.create.card'); 2 | const fund_Card = require('../services/virtual-cards/rave.fund'); 3 | const retrieve_all_Cards = require('../services/virtual-cards/rave.retrieve.all.cards'); 4 | const block_card = require('../services/virtual-cards/rave.block_unblock'); 5 | const unblock_card = require('../services/virtual-cards/rave.block_unblock'); 6 | const terminate_card = require('../services/virtual-cards/rave.terminate'); 7 | const card_transactions = require('../services/virtual-cards/rave.transactions'); 8 | const withdraw_from_Card = require('../services/virtual-cards/rave.withdraw'); 9 | const retrieve_single_Card = require('../services/virtual-cards/rave.retrieve.single.card'); 10 | 11 | function Virtual_card(RaveBase) { 12 | this.create = function (data) { 13 | return create_Card(data, RaveBase); 14 | }; 15 | this.fund = function (data) { 16 | return fund_Card(data, RaveBase); 17 | }; 18 | 19 | this.fetch_all = function (data) { 20 | return retrieve_all_Cards(data, RaveBase); 21 | }; 22 | this.fetch = function (data) { 23 | return retrieve_single_Card(data, RaveBase); 24 | }; 25 | 26 | this.block = function (data) { 27 | return block_card(data, RaveBase); 28 | }; 29 | this.unblock = function (data) { 30 | return unblock_card(data, RaveBase); 31 | }; 32 | this.terminate = function (data) { 33 | return terminate_card(data, RaveBase); 34 | }; 35 | this.transactions = function (data) { 36 | return card_transactions(data, RaveBase); 37 | }; 38 | this.withdraw_funds = function (data) { 39 | return withdraw_from_Card(data, RaveBase); 40 | }; 41 | } 42 | module.exports = Virtual_card; 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flutterwave-node-v3", 3 | "version": "1.3.0", 4 | "description": "The official Node.JS library for Flutterwave v3 payment APIs", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha **/*.test.js", 8 | "test-watch": "nodemon --exec \"npm test\"", 9 | "coverage": "nyc npm run test", 10 | "report-coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov" 11 | }, 12 | "nyc": { 13 | "coverage": "test", 14 | "check-coverage": true, 15 | "functions": 5, 16 | "lines": 5, 17 | "report-dir": "./coverage", 18 | "reporter": [ 19 | "lcov" 20 | ] 21 | }, 22 | "keywords": [], 23 | "author": "Flutterwave Developers", 24 | "license": "MIT", 25 | "dependencies": { 26 | "axios": "^1.8.4", 27 | "bluebird": "^3.7.2", 28 | "chai-as-promised-also-chain": "^1.0.2", 29 | "eslint-config-prettier": "^8.6.0", 30 | "joi": "^17.8.3", 31 | "md5": "^2.3.0", 32 | "node-forge": "1.3.0", 33 | "q": "^1.5.1", 34 | "sha.js": "^2.4.11", 35 | "winston": "^3.8.2" 36 | }, 37 | "devDependencies": { 38 | "chai": "^4.3.6", 39 | "chai-as-promised": "^7.1.1", 40 | "codecov": "^3.8.3", 41 | "dotenv": "^10.0.0", 42 | "eslint": "^8.33.0", 43 | "eslint-config-airbnb-base": "^15.0.0", 44 | "eslint-plugin-import": "^2.27.5", 45 | "mocha": "^9.2.2", 46 | "nyc": "^15.1.0", 47 | "prettier": "2.8.3", 48 | "should": "^13.2.3", 49 | "sinon": "^15.0.1", 50 | "sinon-chai": "^3.7.0" 51 | }, 52 | "directories": { 53 | "lib": "lib", 54 | "test": "test" 55 | }, 56 | "repository": { 57 | "type": "git", 58 | "url": "git+https://github.com/Flutterwave/Flutterwave-node-v3.git" 59 | }, 60 | "bugs": { 61 | "url": "https://github.com/Flutterwave/Flutterwave-node-v3/issues" 62 | }, 63 | "homepage": "https://github.com/Flutterwave/Flutterwave-node-v3#readme" 64 | } 65 | -------------------------------------------------------------------------------- /lib/rave.charge.js: -------------------------------------------------------------------------------- 1 | const card_charge = require('../services/charge/rave.card.charge'); 2 | const ng_banks = require('../services/charge/rave.ng-banks'); 3 | const uk_bank = require('../services/charge/rave.uk-banks'); 4 | const ussd_Charge = require('../services/charge/rave.ussd'); 5 | const validate_charge = require('../services/charge/rave.validate'); 6 | const voucher_charge = require('../services/charge/rave.voucher'); 7 | const ach_payment = require('../services/charge/rave.ach'); 8 | const bank_trans = require('../services/charge/rave.bank.transfer'); 9 | const applepay = require('../services/charge/rave.applepay'); 10 | const googlepay = require('../services/charge/rave.googlepay'); 11 | const enaira = require('../services/charge/rave.enaira'); 12 | const fawrypay = require('../services/charge/rave.fawrypay'); 13 | 14 | function Charge(RaveBase) { 15 | this.card = function (data) { 16 | return card_charge(data, RaveBase); 17 | }; 18 | 19 | this.ng = function (data) { 20 | return ng_banks(data, RaveBase); 21 | }; 22 | 23 | this.ach = function (data) { 24 | return ach_payment(data, RaveBase); 25 | }; 26 | 27 | this.uk = function (data) { 28 | return uk_bank(data, RaveBase); 29 | }; 30 | 31 | this.ussd = function (data) { 32 | return ussd_Charge(data, RaveBase); 33 | }; 34 | 35 | this.validate = function (data) { 36 | return validate_charge(data, RaveBase); 37 | }; 38 | 39 | this.voucher = function (data) { 40 | return voucher_charge(data, RaveBase); 41 | }; 42 | this.bank_transfer = function (data) { 43 | return bank_trans(data, RaveBase); 44 | }; 45 | this.applepay = function (data) { 46 | return applepay(data, RaveBase); 47 | }; 48 | this.googlepay = function (data) { 49 | return googlepay(data, RaveBase); 50 | }; 51 | this.enaira = function (data) { 52 | return enaira(data, RaveBase); 53 | }; 54 | this.fawrypay = function (data) { 55 | return fawrypay(data, RaveBase); 56 | }; 57 | } 58 | module.exports = Charge; 59 | -------------------------------------------------------------------------------- /.github/workflows/package-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish changes to Node package manager 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | check-readme-and-changelog: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v2 13 | 14 | - name: Check for README and CHANGELOG changes 15 | run: | 16 | if ! git diff --quiet HEAD~ HEAD -- README.md CHANGELOG.md; then 17 | echo "README and/or CHANGELOG have been modified. Proceeding with deployment." 18 | else 19 | echo "README and/or CHANGELOG have not been modified. Terminating deployment." 20 | exit 1 21 | fi 22 | 23 | - name: push build status to Slack 24 | uses: 8398a7/action-slack@v3 25 | with: 26 | status: ${{ job.status }} 27 | fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest 28 | env: 29 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} 30 | if: always() 31 | 32 | publish: 33 | needs: check-readme-and-changelog 34 | runs-on: ubuntu-latest 35 | steps: 36 | - name: Checkout code 37 | uses: actions/checkout@v2 38 | 39 | - name: Setup Node Engine 40 | uses: actions/setup-node@v1 41 | with: 42 | node-version: 16 43 | registry-url: https://registry.npmjs.org/ 44 | 45 | - name: Install Node dependencies 46 | run: npm ci 47 | 48 | - run: npm publish 49 | env: 50 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 51 | 52 | - name: Send Slack Notification 53 | uses: 8398a7/action-slack@v3 54 | with: 55 | status: ${{ job.status }} 56 | fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest 57 | env: 58 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} 59 | MATRIX_CONTEXT: ${{ toJson(matrix) }} 60 | if: always() 61 | -------------------------------------------------------------------------------- /test/rave.subscriptions.test.js: -------------------------------------------------------------------------------- 1 | const Subscriptions = require('../lib/rave.subscriptions'); 2 | var base = require('../lib/rave.base'); 3 | 4 | var Promise = require('bluebird'); 5 | var mocha = require('mocha'); 6 | var chai = require('chai'); 7 | var expect = chai.expect; 8 | var chaiAsPromised = require('chai-as-promised'); 9 | 10 | var dotenv = require('dotenv').config(); 11 | 12 | const sinon = require('sinon'); 13 | const sinonChai = require('sinon-chai'); 14 | 15 | chai.use(chaiAsPromised); 16 | chai.use(sinonChai); 17 | 18 | describe('#Rave Subscriptions', function () { 19 | const public_key = process.env.PUBLIC_KEY; 20 | const secret_key = process.env.SECRET_KEY; 21 | const ravebase = new base(public_key, secret_key); 22 | 23 | let subscriptionInstance; 24 | let subscriptionStub; 25 | 26 | beforeEach(() => { 27 | subscriptionInstance = new Subscriptions(ravebase); 28 | }); 29 | 30 | afterEach(() => { 31 | sinon.restore(); 32 | }); 33 | 34 | // it.only('should return a single subscription ', async function () { 35 | // this.timeout(10000); 36 | 37 | // var payload = { 38 | // email: 'cornelius@flutterwavego.com', 39 | // }; 40 | // var resp = await subscriptionInstance.get(payload); 41 | // console.log(resp); 42 | // return expect(resp).to.have.property('data'); 43 | // }); 44 | 45 | // it("should cancel a user's subscription", async function () { 46 | // this.timeout(10000); 47 | 48 | // var payload = { 49 | // id: '11343', 50 | // }; 51 | // var resp = await subscriptionInstance.cancel(payload); 52 | // return expect(resp).to.have.property('message'); 53 | // }); 54 | 55 | // it('should activate Subscription', async function () { 56 | // this.timeout(10000); 57 | 58 | // var payload = { 59 | // id: '11343', 60 | // }; 61 | // var resp = await subscriptionInstance.activate(payload); 62 | // return expect(resp).to.have.property('data'); 63 | // }); 64 | }); 65 | -------------------------------------------------------------------------------- /services/charge/rave.voucher.js: -------------------------------------------------------------------------------- 1 | // const morx = require('morx'); 2 | // const q = require('q'); 3 | // const encrypt = require('./encryp'); 4 | // const axios = require('axios'); 5 | // const package = require('../../package.json'); 6 | 7 | // var spec = morx.spec() 8 | // .build('currency', 'required:true, eg:GBP') 9 | // .build('account_bank', 'required:false') 10 | // .build('amount', 'required:true, eg:10') 11 | // .build('phone_number', 'required:false, eg:08030930236') 12 | // .build('email', 'required:true, eg:debowalefaulkner@gmail.com') 13 | // .build('fullname', 'required:false, eg:lawal garba') 14 | // .build('client_ip', 'required:false, eg:127.0.0.1') 15 | // .build('tx_ref', 'required:false, eg:FLW_y-443342') 16 | // .build('subaccounts', 'required:false') 17 | // .build('meta', 'required:false') 18 | // .build('pin', 'required:true') 19 | // .build('country', 'required:false') 20 | // .build('redirect_url', 'required:false') 21 | // .build('device_fingerprint', 'required:false') 22 | // .build('type', 'required:true eg:ussd') 23 | // .end(); 24 | 25 | // function service(data, _rave) { 26 | // axios.post('https://kgelfdz7mf.execute-api.us-east-1.amazonaws.com/staging/sendevent', { 27 | // "publicKey": _rave.getPublicKey(), 28 | // "language": "NodeJs v3", 29 | // "version": package.version, 30 | // "title": "Incoming call", 31 | // "message": "Initiate Voucher payment" 32 | // }) 33 | 34 | // var d = q.defer(); 35 | 36 | // q.fcall(() => { 37 | 38 | // var validated = morx.validate(data, spec, _rave.MORX_DEFAULT, {throw_error:true}); 39 | // var params = validated.params; 40 | 41 | // return (params); 42 | 43 | // }) 44 | // .then(params => { 45 | 46 | // return _rave.request('v3/charges?type=voucher_payment', params) 47 | // }) 48 | // .then(response => { 49 | 50 | // d.resolve(response.body); 51 | 52 | // }) 53 | // .catch(err => { 54 | 55 | // d.reject(err); 56 | 57 | // }) 58 | 59 | // return d.promise; 60 | 61 | // } 62 | // service.morxspc = spec; 63 | // module.exports = service; 64 | -------------------------------------------------------------------------------- /lib/security.js: -------------------------------------------------------------------------------- 1 | var createHash = require('sha.js'); 2 | 3 | // this is the getKey function that generates an encryption Key 4 | // for you by passing your Secret Key as a parameter. 5 | function getKey(seckey) { 6 | var md5 = require('md5'); 7 | var keymd5 = md5(seckey); 8 | var keymd5last12 = keymd5.substr(-12); 9 | 10 | var seckeyadjusted = seckey.replace('FLWSECK-', ''); 11 | var seckeyadjustedfirst12 = seckeyadjusted.substr(0, 12); 12 | 13 | return seckeyadjustedfirst12 + keymd5last12; 14 | } 15 | 16 | // This is the encryption function that encrypts your payload 17 | // by passing the stringified format and your encryption Key. 18 | // function encrypt(key, text) 19 | // { 20 | // console.log("Key: "+key) 21 | 22 | // console.log("Txt: "+text) 23 | // var forge = require('node-forge'); 24 | // var cipher = forge.cipher.createCipher('3DES-ECB', forge.util.createBuffer(key)); 25 | // cipher.start({iv:''}); 26 | // cipher.update(forge.util.createBuffer(text, 'utf-8')); 27 | // cipher.finish(); 28 | // var encrypted = cipher.output; 29 | // return ( forge.util.encode64(encrypted.getBytes()) ); 30 | // } 31 | 32 | function encrypt(key, text) { 33 | var forge = require("node-forge"); 34 | var cipher = forge.cipher.createCipher( 35 | "3DES-ECB", 36 | forge.util.createBuffer(key) 37 | ); 38 | cipher.start({ 39 | iv: "" 40 | }); 41 | cipher.update(forge.util.createBuffer(text, "utf-8")); 42 | cipher.finish(); 43 | var encrypted = cipher.output; 44 | return forge.util.encode64(encrypted.getBytes()); 45 | } 46 | 47 | function getIntegrityHash(data, pubkey, seckey) { 48 | 49 | var objectKeys = Object.keys(data); 50 | objectKeys.sort(); 51 | var hashString = ""; 52 | objectKeys 53 | .forEach(function (ok) { 54 | 55 | if (ok == 'integrity_hash') return; // don't include int hash 56 | hashString += data[ok]; 57 | 58 | }); 59 | hashString += seckey; 60 | var hash = createHash('sha256').update(hashString, 'utf8').digest('hex'); 61 | return hash; 62 | } 63 | 64 | 65 | module.exports = { 66 | getEncryptionKey: getKey, 67 | encrypt: encrypt, 68 | getIntegrityHash: getIntegrityHash 69 | } -------------------------------------------------------------------------------- /lib/rave.bills.js: -------------------------------------------------------------------------------- 1 | const amount_to_be_paid = require('../services/bills/rave.amount.to-be-paid'); 2 | const createbill = require('../services/bills/rave.create-bill.payment'); 3 | const create_bulk = require('../services/bills/rave.create-bulk.bills'); 4 | const create_order_billing = require('../services/bills/rave.create-order-billing-code'); 5 | // const get_a_recurring = require('../services/bills/rave.get-a-recurring-bill') 6 | const bills = require('../services/bills/rave.get-bill-payments'); 7 | const bill_cat = require('../services/bills/rave.get.bill-categories'); 8 | const bill_agencies = require('../services/bills/rave.get.bill-payment-agencies'); 9 | // const get_recurring_bills = require ('../services/bills/rave.get.recurrings-bills') 10 | const status = require('../services/bills/rave.get.status'); 11 | const prdts_under_agency = require('../services/bills/rave.products-under-an-agency'); 12 | const update_bills_order = require('../services/bills/rave.update-bills.order'); 13 | const validate_bill = require('../services/bills/rave.validate-bill'); 14 | 15 | function Bills(RaveBase) { 16 | this.create_bill = function (data) { 17 | return createbill(data, RaveBase); 18 | }; 19 | 20 | this.amt_to_be_paid = function (data) { 21 | return amount_to_be_paid(data, RaveBase); 22 | }; 23 | 24 | this.create_bulk = function (data) { 25 | return create_bulk(data, RaveBase); 26 | }; 27 | 28 | this.create_ord_billing = function (data) { 29 | return create_order_billing(data, RaveBase); 30 | }; 31 | 32 | this.fetch_bills = function (data) { 33 | return bills(data, RaveBase); 34 | }; 35 | 36 | this.fetch_bills_Cat = function (data) { 37 | return bill_cat(data, RaveBase); 38 | }; 39 | this.fetch_bills_agencies = function (data) { 40 | return bill_agencies(data, RaveBase); 41 | }; 42 | this.fetch_status = function (data) { 43 | return status(data, RaveBase); 44 | }; 45 | this.products_under_agency = function (data) { 46 | return prdts_under_agency(data, RaveBase); 47 | }; 48 | 49 | this.update_bills = function (data) { 50 | return update_bills_order(data, RaveBase); 51 | }; 52 | 53 | this.validate = function (data) { 54 | return validate_bill(data, RaveBase); 55 | }; 56 | } 57 | module.exports = Bills; 58 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const base = require('./lib/rave.base'); 2 | const bank = require('./lib/rave.banks'); 3 | const beneficiary = require('./lib/rave.beneficiaries'); 4 | const bills = require('./lib/rave.bills'); 5 | const charge = require('./lib/rave.charge'); 6 | const ebills = require('./lib/rave.ebills'); 7 | const misc = require('./lib/rave.misc'); 8 | const mobile_money = require('./lib/rave.mobile_money'); 9 | const security = require('./lib/security'); 10 | // const custom = require("./lib/rave.custom"); 11 | const otps = require('./lib/rave.otps'); 12 | const payment_plan = require('./lib/rave.payment_plan'); 13 | const settlement = require('./lib/rave.settlements'); 14 | const subaccount = require('./lib/rave.subaccount'); 15 | const subscription = require('./lib/rave.subscriptions'); 16 | const tokenized = require('./lib/rave.tokenized'); 17 | const transaction = require('./lib/rave.transactions'); 18 | const transfer = require('./lib/rave.transfers'); 19 | const virtual_acct = require('./lib/rave.virtual_account'); 20 | const virtual_card = require('./lib/rave.virtual_cards'); 21 | 22 | const Rave = function (public_key, public_secret, base_url_or_production_flag) { 23 | const ravebase = new base( 24 | public_key, 25 | public_secret, 26 | base_url_or_production_flag, 27 | ); 28 | 29 | this.Bank = new bank(ravebase); 30 | this.Beneficiary = new beneficiary(ravebase); 31 | this.Bills = new bills(ravebase); 32 | this.Charge = new charge(ravebase); 33 | this.Ebills = new ebills(ravebase); 34 | this.Misc = new misc(ravebase); 35 | this.MobileMoney = new mobile_money(ravebase); 36 | this.security = security; 37 | // this.CustomRequest = new custom(ravebase); 38 | this.Otp = new otps(ravebase); 39 | this.PaymentPlan = new payment_plan(ravebase); 40 | this.Settlement = new settlement(ravebase); 41 | this.Subscription = new subscription(ravebase); 42 | this.Subaccount = new subaccount(ravebase); 43 | this.Tokenized = new tokenized(ravebase); 44 | this.Transaction = new transaction(ravebase); 45 | this.Transfer = new transfer(ravebase); 46 | this.VirtualAcct = new virtual_acct(ravebase); 47 | this.VirtualCard = new virtual_card(ravebase); 48 | 49 | this.getIntegrityHash = function (data) { 50 | return ravebase.getIntegrityHash(data); 51 | }; 52 | }; 53 | 54 | module.exports = Rave; 55 | -------------------------------------------------------------------------------- /services/schema/base.js: -------------------------------------------------------------------------------- 1 | const joi = require('joi'); 2 | 3 | // fetch information with single id. enforce id in payload 4 | const fetchSchema = joi.object({ 5 | id: joi.number().integer().required(), 6 | }); 7 | 8 | // retrieve information with different query parameter. add enforceRequired to enforce query params and validate the request 9 | const listSchema = joi.object({ 10 | id: joi.string(), 11 | page: joi.string().min(1), 12 | index: joi.string().min(1), 13 | size: joi.string().min(1), 14 | from: joi.string().isoDate(), 15 | to: joi.string().isoDate(), 16 | bulk_id: joi.string(), 17 | reference: joi.string(), 18 | tx_ref: joi.string().trim().max(100), 19 | currency: joi.string().uppercase().length(3).default('NGN'), 20 | country: joi.string().uppercase().length(2).default('NG'), 21 | amount: joi.number().positive(), 22 | status: joi.string().max(20), 23 | interval: joi 24 | .string() 25 | .max(20) 26 | .valid('daily', 'weekly', 'monthly', 'quarterly', 'yearly'), 27 | account_bank: joi.string().min(3).max(11), 28 | account_number: joi.string().trim().max(20), 29 | bank_name: joi.string().trim().max(100), 30 | split_value: joi.number().min(0).max(1), 31 | business_name: joi.string().trim().max(100), 32 | business_email: joi.string().email(), 33 | split_type: joi.string().valid('percentage', 'flat'), 34 | subscribed_from: joi.string().isoDate(), 35 | subscribed_to: joi.string().isoDate(), 36 | plan: joi.string().min(1), 37 | customer_fullname: joi.string().max(100), 38 | email: joi.string().max(100).email(), 39 | airtime: joi.number().integer().positive().min(0).max(1), 40 | data_bundle: joi.number().integer().positive().min(0).max(1), 41 | power: joi.number().integer().positive().min(0).max(1), 42 | internet: joi.number().integer().positive().min(0).max(1), 43 | toll: joi.number().integer().positive().min(0).max(1), 44 | cable: joi.number().integer().positive().min(0).max(1), 45 | }); 46 | 47 | // Set id for update 48 | const updateSchema = joi.object({ 49 | id: joi.string().required(), 50 | }); 51 | 52 | // validate collections 53 | const validateSchema = joi.object({ 54 | otp: joi.string().min(5).max(7).required(), 55 | flw_ref: joi.string().required(), 56 | type: joi.string().valid('card', 'account'), 57 | }); 58 | 59 | module.exports = { 60 | fetchSchema, 61 | listSchema, 62 | updateSchema, 63 | validateSchema, 64 | }; 65 | -------------------------------------------------------------------------------- /test/rave.cards.test.js: -------------------------------------------------------------------------------- 1 | // var cards = require('../lib/rave.virtual_cards'); 2 | // var tokenPayments = require('../lib/rave.tokenized'); 3 | // var base = require('../lib/rave.base'); 4 | 5 | // var Promise = require('bluebird'); 6 | // var mocha = require('mocha'); 7 | // var chai = require('chai'); 8 | // var expect = chai.expect; 9 | // var chaiAsPromised = require('chai-as-promised'); 10 | 11 | // var dotenv = require('dotenv').config(); 12 | 13 | // const sinon = require('sinon'); 14 | // const sinonChai = require('sinon-chai'); 15 | 16 | // chai.use(chaiAsPromised); 17 | // chai.use(sinonChai); 18 | 19 | // describe('#Rave Cards issuing', function () { 20 | // const public_key = process.env.PUBLIC_KEY; 21 | // const secret_key = process.env.SECRET_KEY; 22 | // const ravebase = new base(public_key, secret_key); 23 | 24 | // // let trxInstance; 25 | // // let momoStub; 26 | 27 | // beforeEach(() => { 28 | // cardInstance = new cards(ravebase); 29 | // }); 30 | 31 | // afterEach(() => { 32 | // sinon.restore(); 33 | // }); 34 | 35 | // it('should successfully fetch all cards', async function () { 36 | // this.timeout(10000); 37 | // // var payload = { 38 | // // id: '4186265', 39 | // // }; 40 | 41 | // var resp = await cardInstance.fetch_all(); 42 | // // console.log(resp); 43 | // }); 44 | 45 | // it('should successfully fetch card details', async function () { 46 | // this.timeout(10000); 47 | // var payload = { 48 | // id: '776192c3-a85b-4dc4-9620-109877d1f6f8', 49 | // }; 50 | 51 | // var resp = await cardInstance.fetch(payload); 52 | // // console.log(resp); 53 | // }); 54 | 55 | // it('should create a virtual card', async function () { 56 | // this.timeout(10000); 57 | 58 | // var payload = { 59 | // currency: 'USD', 60 | // amount: 5, 61 | // debit_currency: 'NGN', 62 | // billing_name: 'Example User.', 63 | // billing_address: '333, Fremont Street', 64 | // billing_city: 'San Francisco', 65 | // billing_state: 'CA', 66 | // billing_postal_code: '94105', 67 | // billing_country: 'US', 68 | // first_name: 'Example', 69 | // last_name: 'User', 70 | // date_of_birth: '1996/12/30', 71 | // email: 'userg@example.com', 72 | // phone: '07030000000', 73 | // title: 'Mr', 74 | // gender: 'M', 75 | // callback_url: 'https://webhook.site/b67965fa-e57c-4dda-84ce-0f8d6739b8a5', 76 | // }; 77 | 78 | // var resp = await cardInstance.create(payload); 79 | // // console.log(resp); 80 | // }); 81 | // }); 82 | -------------------------------------------------------------------------------- /views/index.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title RavePay 5 | //- link(rel="stylesheet", href="/bower_components/bootstrap/dist/css/bootstrap.css") 6 | //- link(rel="stylesheet", href="/css/style.css") 7 | 8 | body 9 | .container 10 | block content 11 | h1 #{title} 12 | 13 | form 14 | script(src='https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/hosted/pay') 15 | button(type='button', onclick='payWithRave()') Pay Now 16 | script. 17 | const API_publicKey = "FLWPUBK-xxxxxxxxxxxxxxxxxxxxx-X"; 18 | function payWithRave() { 19 | var x = getpaidSetup({ 20 | PBFPubKey: API_publicKey, 21 | customer_email: "user@example.com", 22 | amount: 2000, 23 | customer_phone: "234099940409", 24 | currency: "NGN", 25 | payment_options: "card,account", 26 | txref: "rave-123456", 27 | hosted_payment: 1, 28 | //- redirect_url: "https://your-website.com/url-to-redirect-to" 29 | meta: [{ 30 | metaname: "flightID", 31 | metavalue: "AP1234" 32 | }], 33 | onclose: function() {}, 34 | callback: function(response) { 35 | var txref = response.tx.txRef; // collect txRef returned and pass to a server page to complete status check. 36 | console.log("This is the response returned after a charge", response); 37 | if ( 38 | response.tx.chargeResponseCode == "00" || 39 | response.tx.chargeResponseCode == "0" 40 | ) { 41 | // redirect to a success page 42 | } else { 43 | // redirect to a failure page. 44 | } 45 | x.close(); // use this to close the modal immediately after payment. 46 | } 47 | }); 48 | } 49 | 50 | br 51 | hr 52 | footer 53 | p copyright © 2019 54 | 55 | //- script(src='/bower_components/bootstrap/js/dist/dropdown.js') 56 | //- script(src='/bower_components/bootstrap/dist/js/bootstrap.js') 57 | 58 | -------------------------------------------------------------------------------- /services/schema/bill.js: -------------------------------------------------------------------------------- 1 | const joi = require('joi'); 2 | 3 | const amountQuerySchema = joi.object({ 4 | id: joi.string().required(), 5 | product_id: joi.string().required(), 6 | }); 7 | 8 | const createSchema = joi.object({ 9 | country: joi.string().uppercase().length(2).default('NG'), 10 | amount: joi.number().positive().required(), 11 | customer: joi.string().required(), 12 | recurrence: joi.string().required(), 13 | reference: joi.string().required(), 14 | type: joi.string(), 15 | }); 16 | 17 | const bulkCreateSchema = joi.object({ 18 | bulk_reference: joi.string().required(), 19 | callback_url: joi.string().uri().required(), 20 | bulk_data: joi 21 | .array() 22 | .items( 23 | joi.object({ 24 | country: joi.string().required(), 25 | customer: joi.string().required(), 26 | amount: joi.number().positive().required(), 27 | recurrence: joi.string().valid('WEEKLY', 'MONTHLY').required(), 28 | type: joi.string().required(), 29 | reference: joi.string().required(), 30 | }), 31 | ) 32 | .min(1) 33 | .required(), 34 | }); 35 | 36 | const createOrderSchema = joi.object({ 37 | id: joi.string().required(), 38 | product_id: joi.string().required(), 39 | amount: joi.number().positive().required(), 40 | country: joi.string().required(), 41 | reference: joi.string().trim().max(100).required(), 42 | customer: joi 43 | .object({ 44 | name: joi.string().required(), 45 | email: joi.string().email().required(), 46 | phone_number: joi 47 | .string() 48 | .max(50) 49 | .custom((value) => { 50 | if (value && !/^\+?\d+$/.test(value)) 51 | throw new Error('phone number should be digits'); 52 | return value; 53 | }) 54 | .required(), 55 | }) 56 | .required(), 57 | fields: joi 58 | .array() 59 | .items( 60 | joi.object({ 61 | id: joi.string(), 62 | quantity: joi.string(), 63 | value: joi.string(), 64 | }), 65 | ) 66 | .required(), 67 | }); 68 | 69 | const fetchStatusSchema = joi.object({ 70 | reference: joi.string().trim().max(100).required(), 71 | }); 72 | 73 | const updateOrderSchema = joi.object({ 74 | amount: joi.number().required(), 75 | order_id: joi.string().trim().max(100).required(), 76 | reference: joi.string().trim().max(100).required(), 77 | }); 78 | 79 | const validateSchema = joi.object({ 80 | code: joi.string().trim().max(100).required(), 81 | item_code: joi.string().trim().max(100).required(), 82 | customer: joi.string().trim().max(100).required(), 83 | }); 84 | 85 | module.exports = { 86 | amountQuerySchema, 87 | createSchema, 88 | bulkCreateSchema, 89 | createOrderSchema, 90 | fetchStatusSchema, 91 | updateOrderSchema, 92 | validateSchema, 93 | }; 94 | -------------------------------------------------------------------------------- /documentation/ebills.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
2 |
3 |
2 |
3 |
2 |
3 |
2 |
3 |
2 |
3 |
2 |
3 |
2 |
3 |
2 |
3 |