// Main entry point for VerifyIndia API require('dotenv').config(); const express = require('express'); const helmet = require('helmet'); const cors = require('cors'); const morgan = require('morgan'); const { connectDB } = require('./database/connection'); const authRoutes = require('./routes/auth'); const ifscRoutes = require('./routes/ifsc'); const pincodeRoutes = require('./routes/pincode'); const gstRoutes = require('./routes/gst'); const panRoutes = require('./routes/pan'); console.log('✅ PAN routes loaded:', typeof panRoutes); const bankRoutes = require('./routes/bank'); const userRoutes = require('./routes/user'); const { errorHandler } = require('./middleware/errorHandler'); const app = express(); app.use(helmet()); app.use(cors()); // JSON body parser with error handling app.use(express.json({ limit: '10mb', verify: (req, res, buf) => { try { JSON.parse(buf); } catch (e) { console.error('JSON parse error:', e.message); res.status(400).json({ success: false, error: { code: 'INVALID_JSON', message: 'Invalid JSON in request body' } }); } } })); // Debug middleware to log all requests app.use((req, res, next) => { console.log(`[${new Date().toISOString()}] ${req.method} ${req.originalUrl}`); console.log('Headers:', req.headers); console.log('Body:', req.body); next(); }); app.use(morgan('combined')); app.get('/health', (req, res) => { res.json({ status: 'healthy', timestamp: new Date().toISOString() }); }); app.get('/', (req, res) => { res.json({ message: 'VerifyIndia API', version: 'v1', endpoints: { ifsc: '/v1/ifsc/:ifsc_code', pincode: '/v1/pincode/:pincode', gst: '/v1/gst/verify/:gstin', pan: '/v1/pan/verify', bank: '/v1/bank/verify' } }); }); app.use('/v1/auth', authRoutes); app.use('/v1/user', userRoutes); app.use('/v1/ifsc', ifscRoutes); app.use('/v1/pincode', pincodeRoutes); app.use('/v1/gst', gstRoutes); // Test route to verify routing works (must be BEFORE panRoutes) app.get('/v1/pan/test', (req, res) => { console.log('PAN test route hit!'); res.json({ message: 'PAN route is working', timestamp: new Date().toISOString() }); }); // Log all registered routes for debugging console.log('Registering PAN routes at /v1/pan'); app.use('/v1/pan', panRoutes); console.log('PAN routes registered'); app.use('/v1/bank', bankRoutes); app.use('*', (req, res) => { res.status(404).json({ success: false, error: { code: 'NOT_FOUND', message: `Route ${req.originalUrl} not found` } }); }); app.use(errorHandler); const PORT = process.env.PORT || 3000; async function startServer() { try { await connectDB(); console.log('✅ PostgreSQL connected'); // // Try to connect Redis, but don't fail if it's not available // try { // const { connectRedis, isDummyCache } = require('./cache/redis'); // await connectRedis(); // if (isDummyCache()) { // console.log('📦 Using in-memory cache (Redis not available)'); // } else { // console.log('✅ Redis connected'); // } // } catch (redisError) { // console.log('📦 Using in-memory cache (Redis connection failed)'); // } app.listen(PORT, () => { console.log(`✅ Server running on port ${PORT}`); }); } catch (error) { console.error('❌ Failed to start:', error); process.exit(1); } } startServer();