Spaces:
Running
Running
File size: 4,878 Bytes
b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | 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
};
|