const express = require('express'); const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); const User = require('../models/User'); const router = express.Router(); // Register router.post('/register', async (req, res) => { try { const { username, email, password, fullName } = req.body; // Validate input if (!username || !email || !password || !fullName) { return res.status(400).json({ message: 'همه فیلدهای ضروری را پر کنید' }); } // Validate email format const emailRegex = /\S+@\S+\.\S+/; if (!emailRegex.test(email)) { return res.status(400).json({ message: 'فرمت ایمیل نامعتبر است' }); } // Check if user exists let user = await User.findOne({ $or: [{ email }, { username }] }); if (user) { return res.status(400).json({ message: 'کاربر با این ایمیل یا نام کاربری وجود دارد' }); } // Create new user user = new User({ username, email, password, profile: { fullName } }); await user.save(); // Generate JWT token const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '30d' }); // Set cookie res.cookie('token', token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days sameSite: 'strict' }); res.status(201).json({ success: true, token, user: { id: user._id, username, email, role: user.role, fullName } }); } catch (err) { console.error('Registration error:', err); res.status(500).json({ success: false, message: 'خطای سرور. لطفا دوباره تلاش کنید' }); } }); // Login router.post('/login', async (req, res) => { try { const { email, password } = req.body; // Validate input if (!email || !password) { return res.status(400).json({ message: 'ایمیل و رمز عبور را وارد کنید' }); } // Find user const user = await User.findOne({ email }); if (!user) { return res.status(401).json({ success: false, message: 'ایمیل یا رمز عبور اشتباه است' }); } // Check password const isMatch = await user.comparePassword(password); if (!isMatch) { return res.status(401).json({ success: false, message: 'ایمیل یا رمز عبور اشتباه است' }); } // Generate JWT token const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '30d' }); // Set cookie res.cookie('token', token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days sameSite: 'strict' }); res.json({ success: true, token, user: { id: user._id, username: user.username, email: user.email, role: user.role, fullName: user.profile?.fullName || '' } }); } catch (err) { console.error('Login error:', err); res.status(500).json({ success: false, message: 'خطای سرور. لطفا دوباره تلاش کنید' }); } }); // Get current user router.get('/me', async (req, res) => { try { const token = req.cookies.token || req.headers.authorization?.split(' ')[1]; if (!token) { return res.status(401).json({ success: false, message: 'Not authorized' }); } const decoded = jwt.verify(token, process.env.JWT_SECRET); const user = await User.findById(decoded.id).select('-password'); if (!user) { return res.status(404).json({ success: false, message: 'User not found' }); } res.json({ success: true, user }); } catch (err) { console.error('Auth error:', err); res.status(401).json({ success: false, message: 'Not authorized' }); } }); // Logout router.get('/logout', (req, res) => { res.clearCookie('token'); res.json({ success: true, message: 'Logged out successfully' }); }); // Auth middleware function auth(req, res, next) { const token = req.cookies.token || req.headers.authorization?.split(' ')[1]; if (!token) { return res.status(401).json({ success: false, message: 'Not authorized' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (err) { console.error('Auth error:', err); res.status(401).json({ success: false, message: 'Not authorized' }); } } module.exports = { router, auth };