const express = require('express'); const router = express.Router(); const jwt = require('jsonwebtoken'); const User = require('../models/User'); // Register new user router.post('/register', async (req, res) => { try { // Check if registration is enabled const registrationEnabled = process.env.ALLOW_REGISTRATION !== 'false'; if (!registrationEnabled) { return res.status(403).json({ error: 'Registration is currently disabled' }); } const { username, email, password } = req.body; // Check if user already exists const existingUser = await User.findOne({ $or: [{ email }, { username }] }); if (existingUser) { return res.status(400).json({ error: 'User with this email or username already exists' }); } const user = new User({ username, email, password }); await user.save(); // Generate JWT token const token = jwt.sign( { userId: user._id }, process.env.JWT_SECRET, { expiresIn: '7d' } ); res.status(201).json({ message: 'User created successfully', token, user: { id: user._id, username: user.username, email: user.email } }); } catch (error) { res.status(400).json({ error: error.message }); } }); // Login user router.post('/login', async (req, res) => { try { const { email, password } = req.body; // Find user by email const user = await User.findOne({ email }); if (!user) { return res.status(401).json({ error: 'Invalid credentials' }); } // Check password const isPasswordValid = await user.comparePassword(password); if (!isPasswordValid) { return res.status(401).json({ error: 'Invalid credentials' }); } // Generate JWT token const token = jwt.sign( { userId: user._id }, process.env.JWT_SECRET, { expiresIn: '7d' } ); res.json({ message: 'Login successful', token, user: { id: user._id, username: user.username, email: user.email } }); } catch (error) { res.status(500).json({ error: error.message }); } }); // Get user profile (protected route) router.get('/profile', authenticateToken, async (req, res) => { try { const user = await User.findById(req.userId).select('-password'); if (!user) { return res.status(404).json({ error: 'User not found' }); } res.json(user); } catch (error) { res.status(500).json({ error: error.message }); } }); // Middleware to authenticate JWT token function authenticateToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (!token) { return res.status(401).json({ error: 'Access token required' }); } jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => { if (err) { return res.status(403).json({ error: 'Invalid or expired token' }); } req.userId = decoded.userId; next(); }); } module.exports = router;