134 lines
3.5 KiB
JavaScript
134 lines
3.5 KiB
JavaScript
/**
|
|
* PAN Verification Route
|
|
* Verifies PAN and returns holder details
|
|
*/
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const { authenticateApiKey } = require('../middleware/auth');
|
|
const { rateLimit } = require('../middleware/rateLimit');
|
|
const { verifyPAN } = require('../services/panService');
|
|
const { logApiCall } = require('../services/analytics');
|
|
|
|
router.use(authenticateApiKey);
|
|
router.use(rateLimit);
|
|
|
|
router.post('/verify', async (req, res, next) => {
|
|
const startTime = Date.now();
|
|
let success = false;
|
|
|
|
try {
|
|
const { pan, name, dob } = req.body;
|
|
|
|
if (!pan) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: { code: 'MISSING_PAN', message: 'PAN is required' }
|
|
});
|
|
}
|
|
|
|
const panRegex = /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/;
|
|
|
|
if (!panRegex.test(pan.toUpperCase())) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: { code: 'INVALID_PAN', message: 'Invalid PAN format' }
|
|
});
|
|
}
|
|
|
|
const result = await verifyPAN(pan.toUpperCase(), name, dob);
|
|
|
|
if (!result.success) {
|
|
return res.status(result.statusCode || 404).json({
|
|
success: false,
|
|
error: { code: result.errorCode, message: result.message }
|
|
});
|
|
}
|
|
|
|
success = true;
|
|
|
|
res.json({
|
|
success: true,
|
|
data: result.data,
|
|
meta: {
|
|
request_id: `req_pan_${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/pan/verify',
|
|
method: 'POST',
|
|
params: { pan: req.body?.pan },
|
|
status: success ? 200 : 500,
|
|
duration: Date.now() - startTime,
|
|
success,
|
|
isTestKey: req.user.isTestKey
|
|
});
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /verify/:panNumber
|
|
* Fetch PAN details via URL parameter
|
|
*/
|
|
router.get('/verify/:panNumber', async (req, res, next) => {
|
|
const startTime = Date.now();
|
|
let success = false;
|
|
|
|
try {
|
|
const { panNumber } = req.params;
|
|
|
|
if (!panNumber) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: { code: 'MISSING_PAN', message: 'PAN is required' }
|
|
});
|
|
}
|
|
|
|
const result = await verifyPAN(panNumber.toUpperCase());
|
|
|
|
if (!result.success) {
|
|
return res.status(result.statusCode || 404).json({
|
|
success: false,
|
|
error: { code: result.errorCode, message: result.message }
|
|
});
|
|
}
|
|
|
|
success = true;
|
|
|
|
res.json({
|
|
success: true,
|
|
data: result.data,
|
|
meta: {
|
|
request_id: `req_pan_${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/pan/verify',
|
|
method: 'GET',
|
|
params: { pan: req.params?.panNumber },
|
|
status: success ? 200 : 500,
|
|
duration: Date.now() - startTime,
|
|
success,
|
|
isTestKey: req.user.isTestKey
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|