const { logger } = require('../util/logger'); const beneficiaryService = require('../services/beneficiary.service'); const db = require('../config/db'); async function validateWithinBank(req, res) { const { accountNumber } = req.query; if (!accountNumber) { res.status(400).json({ error: 'account number is required', }); } try { const beneficiaryName = await beneficiaryService.validateWithinBank(accountNumber); if (!beneficiaryName) return res.status(401).json({ error: 'invalid account number' }); return res.json({ name: beneficiaryName }); } catch (err) { logger.error(err, 'beneficiary validation within bank failed'); res.status(500).json({ error: 'invalid account number' }); } } async function validateOutsideBank(req, res) { const { accountNo, ifscCode, remitterName } = req.query; if (!accountNo || !ifscCode || !remitterName) { res.status(401).json({ error: 'BAD_REQUEST' }); return; } try { const refNo = await beneficiaryService.validateOutsideBank( accountNo, ifscCode, remitterName ); if (!refNo) return res.status(401).json({ error: 'invalid account number' }); //**IN PRODUCTION** poll the redis server continuously giving the refNo since the response from NPCI will be stored there await delay(3000); return res.json({ name: 'John Doe' }); } catch (err) { logger.error(err, 'beneficiary validation within bank failed'); res.status(500).json({ error: 'invalid account number' }); } } async function addBeneficiary(req, res) { try { const { accountNo, ifscCode, accountType, name } = req.body; const customerNo = req.user; const query = 'INSERT INTO beneficiaries (customer_no, account_no, account_type, ifsc_code, name) VALUES ($1, $2, $3, $4, $5)'; await db.query(query, [customerNo, accountNo, accountType, ifscCode, name]); res.json({ message: 'SUCCESS' }); } catch (error) { logger.error(error, 'Error adding beneficiary'); if ( error.message == 'duplicate key value violates unique constraint "beneficiaries_pkey"' ) { res.status(409).json({ error: 'BENEFICIARY_ALREADY_EXITS' }); } res.status(500).json({ error: 'INTERNAL_SERVER_ERROR' }); } } async function getBeneficiary(req, res) { const { accountNo } = req.query; let beneficiaryDetails; try { if (accountNo) { beneficiaryDetails = await beneficiaryService.getSingleBeneficiary( req.user, accountNo ); } else { beneficiaryDetails = await beneficiaryService.getAllBeneficiaries( req.user ); } if (!beneficiaryDetails) { res.status(404).json({ error: 'NO_BENEFICIARY_FOUND' }); return; } res.json(beneficiaryDetails); } catch (error) { logger.error(error, 'error fetching beneficiaries'); res.status(500).json({ error: 'INTERNAL_SERVER_ERROR' }); } } async function getIfscDetails(req, res) { const { ifscCode } = req.query; if (!ifscCode) { res.status(403).json({ error: 'BAD_REQUEST' }); return; } console.log(ifscCode); try { const query = 'SELECT * FROM ifsc_details WHERE ifsc_code = $1'; const result = await db.query(query, [ifscCode]); console.log(result.rows); if (!result.rows) { res.status(404).json({ error: 'NOT_FOUND' }); return; } res.json(result.rows[0]); } catch (error) { logger.error(error, 'error fetching ifsc code'); res.status(500).json({ error: 'INTERNAL_SERVER_ERROR' }); } } function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } module.exports = { validateWithinBank, validateOutsideBank, addBeneficiary, getIfscDetails, getBeneficiary, };