diff --git a/src/controllers/rtgs.controller.js b/src/controllers/rtgs.controller.js new file mode 100644 index 0000000..e5c9625 --- /dev/null +++ b/src/controllers/rtgs.controller.js @@ -0,0 +1,36 @@ +const axios = require('axios'); + +async function send( + fromAccount, + toAccount, + amount, + ifscCode, + beneficiaryName, + remitterName +) { + try { + const response = await axios.post( + 'http://localhost:8690/kccb/Rtgsfundtransfer', + { + stFromAcc: fromAccount, + stToAcc: toAccount, + stTranAmt: amount, + stCommission: 0, + stIfscCode: ifscCode, + stFullName: remitterName, + stBeneName: beneficiaryName, + stAddress1: '', + stAddress2: '', + stAddress3: '', + } + ); + return response.data; + } catch (error) { + throw new Error( + 'API call to CBS failed' + + (error.response?.data?.message || error.message) + ); + } +} + +module.exports = { send }; diff --git a/src/routes/index.js b/src/routes/index.js index 68fb683..9599fbd 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -5,7 +5,8 @@ const transactionRoute = require('./transactions.route'); const authenticate = require('../middlewares/auth.middleware'); const transferRoute = require('./transfer.route'); const beneficiaryRoute = require('./beneficiary.route'); -const neftRoute = require('./neft.route.js'); +const neftRoute = require('./neft.route'); +const rtgsRoute = require('./rtgs.route'); const { npciResponse } = require('../controllers/npci.controller'); const router = express.Router(); @@ -15,6 +16,7 @@ router.use('/customer', authenticate, detailsRoute); router.use('/transactions/account/:accountNo', authenticate, transactionRoute); router.use('/payment/transfer', authenticate, transferRoute); router.use('/payment/neft', authenticate, neftRoute); +router.use('/payment/rtgs', authenticate, rtgsRoute); router.use('/beneficiary', authenticate, beneficiaryRoute); router.use('/npci/beneficiary-response', npciResponse); diff --git a/src/routes/rtgs.route.js b/src/routes/rtgs.route.js new file mode 100644 index 0000000..389bb93 --- /dev/null +++ b/src/routes/rtgs.route.js @@ -0,0 +1,48 @@ +const express = require('express'); +const rtgsController = require('../controllers/rtgs.controller'); +const { logger } = require('../util/logger'); +const rtgsValidator = require('../validators/rtgs.validator.js'); +const paymentSecretValidator = require('../validators/payment.secret.validator'); + +const router = express.Router(); +router.use(rtgsValidator, paymentSecretValidator); + +const rtgsRoute = async (req, res) => { + const { + fromAccount, + toAccount, + ifscCode, + amount, + beneficiaryName, + remitterName, + } = req.body; + + try { + const result = await rtgsController.send( + fromAccount, + toAccount, + amount, + ifscCode, + beneficiaryName, + remitterName + ); + + if (result.status.startsWith('O.K.')) { + const utr = result.status.slice(9, 25); + return res.json({ message: 'SUCCESS', utr }); + } else if (result.status.includes('INSUFFICIENT FUNDS')) { + return res.status(422).json({ error: 'INSUFFICIENT_FUNDS' }); + } else if (result.status.include('INVALID CHECK DIGIT')) { + return res.status(400).json({ error: 'INVALID_ACCOUNT_NUMBER' }); + } else { + return res.status(400).json({ error: 'PROBLEM_TRANSFERRING_FUNDS' }); + } + } catch (error) { + logger.error(error, 'error occured while doing NEFT transaction'); + return res.status(500).json({ error: 'INTERNAL_SERVER_ERROR' }); + } +}; + +router.post('/', rtgsRoute); + +module.exports = router; diff --git a/src/validators/rtgs.validator.js b/src/validators/rtgs.validator.js new file mode 100644 index 0000000..6eb28d0 --- /dev/null +++ b/src/validators/rtgs.validator.js @@ -0,0 +1,36 @@ +const rtgsValidator = (req, res, next) => { + const { + fromAccount, + toAccount, + amount, + remitterName, + beneficiaryName, + ifscCode, + } = req.body; + + if (!isAccountNumbersValid(fromAccount, toAccount)) { + return res.status(400).json({ error: 'INVALID_ACCOUNT_NUMBER_FORMAT' }); + } + + if (amount < 200000) { + return res.status(400).json({ error: 'AMOUNT_SHOULD_BE_MORE_THAN_200000' }); + } + + if (!remitterName || !beneficiaryName) { + return res + .status(400) + .json({ error: 'REMITTER_NAME AND BENEFICIARY_NAME REQUIRED' }); + } + + if (!ifscCode || !/^[A-Z]{4}0[0-9]{6}$/.test(ifscCode)) { + return res.status(400).json({ error: 'INVALID_IFSC_CODE' }); + } + + next(); +}; + +const isAccountNumbersValid = (fromAcct, toAcct) => { + return !(!fromAcct || !toAcct || fromAcct.length != 11 || toAcct.length < 7); +}; + +module.exports = rtgsValidator;