Spaces:
Running
Running
| 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 | |
| }; | |