require('dotenv').config(); const express = require('express'); const mongoose = require('mongoose'); const bcrypt = require('bcryptjs'); const cors = require('cors'); const jwt = require('jsonwebtoken'); const app = express(); // Middleware app.use(cors()); app.use(express.json()); // MongoDB Connection mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/bavulumkatar_db', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('MongoDB connected')) .catch(err => console.log(err)); // User Model const UserSchema = new mongoose.Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: { type: String, required: true, unique: true }, phone: { type: String }, password: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); const User = mongoose.model('User', UserSchema); // Register Endpoint app.post('/api/register', async (req, res) => { try { const { firstName, lastName, email, phone, password } = req.body; // Check if user exists const existingUser = await User.findOne({ email }); if (existingUser) { return res.status(400).json({ message: 'Email already exists' }); } // Hash password const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password, salt); // Create user const user = new User({ firstName, lastName, email, phone, password: hashedPassword }); await user.save(); // Create token const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET || 'secret', { expiresIn: '30d' }); res.status(201).json({ token, user: { id: user._id, email: user.email } }); } catch (err) { console.error(err); res.status(500).json({ message: 'Server error' }); } }); // Login Endpoint app.post('/api/login', async (req, res) => { try { const { email, password } = req.body; // Find user const user = await User.findOne({ email }); if (!user) { return res.status(400).json({ message: 'Invalid credentials' }); } // Check password const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { return res.status(400).json({ message: 'Invalid credentials' }); } // Create token const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET || 'secret', { expiresIn: '30d' }); res.json({ token, user: { id: user._id, email: user.email } }); } catch (err) { console.error(err); res.status(500).json({ message: 'Server error' }); } }); // Protected Route Example app.get('/api/me', async (req, res) => { try { const token = req.header('x-auth-token'); if (!token) return res.status(401).json({ message: 'No token, authorization denied' }); const decoded = jwt.verify(token, process.env.JWT_SECRET || 'secret'); const user = await User.findById(decoded.id).select('-password'); if (!user) return res.status(404).json({ message: 'User not found' }); res.json(user); } catch (err) { console.error(err); res.status(500).json({ message: 'Server error' }); } }); const PORT = process.env.PORT || 5000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`));