const express = require('express'); const router = express.Router(); const { authenticateApiKey } = require('../middleware/auth'); const { rateLimit } = require('../middleware/rateLimit'); const { query } = require('../database/connection'); const { cacheGet, cacheSet } = require('../cache/redis'); const { logApiCall } = require('../services/analytics'); router.use(authenticateApiKey); router.use(rateLimit); router.get('/:ifsc_code', async (req, res, next) => { const startTime = Date.now(); let success = false; try { const { ifsc_code } = req.params; const ifscRegex = /^[A-Z]{4}0[A-Z0-9]{6}$/; if (!ifscRegex.test(ifsc_code.toUpperCase())) { return res.status(400).json({ success: false, error: { code: 'INVALID_IFSC', message: 'Invalid IFSC format' } }); } const ifsc = ifsc_code.toUpperCase(); const cacheKey = `ifsc:${ifsc}`; let data = await cacheGet(cacheKey); if (!data) { const result = await query('SELECT * FROM ifsc_codes WHERE ifsc = $1', [ifsc]); if (result.rows.length === 0) { return res.status(404).json({ success: false, error: { code: 'IFSC_NOT_FOUND', message: 'IFSC not found' } }); } data = result.rows[0]; await cacheSet(cacheKey, data, 86400); } success = true; res.json({ success: true, data: { ifsc: data.ifsc, bank: data.bank_name, branch: data.branch, address: data.address, city: data.city, district: data.district, state: data.state, contact: data.contact, upi: data.upi_enabled, rtgs: data.rtgs_enabled, neft: data.neft_enabled, imps: data.imps_enabled, micr: data.micr_code, swift: data.swift_code }, meta: { request_id: `req_ifsc_${Date.now()}`, credits_used: 1, credits_remaining: req.user.remaining - 1 } }); } catch (error) { next(error); } finally { await logApiCall({ userId: req.user.id, apiKeyId: req.user.apiKeyId, endpoint: '/v1/ifsc', method: 'GET', params: { ifsc: req.params.ifsc_code }, status: success ? 200 : 500, duration: Date.now() - startTime, success, isTestKey: req.user.isTestKey }); } }); module.exports = router;