Reflex/backend/controllers/authController.js
2025-05-21 22:13:09 +07:00

165 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Контроллер аутентификации
const User = require('../models/User');
const jwt = require('jsonwebtoken');
// Вспомогательная функция для генерации JWT
const generateToken = (id) => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: '30d',
});
};
// @desc Регистрация нового пользователя
// @route POST /api/auth/register
// @access Public
const registerUser = async (req, res, next) => {
try {
const { name, email, password, dateOfBirth, gender } = req.body;
console.log('Начало регистрации пользователя с email:', email);
if (!name || !email || !password) {
res.status(400);
throw new Error('Пожалуйста, заполните все обязательные поля: имя, email и пароль.');
}
const normalizedEmail = email.toLowerCase();
console.log('Нормализованный email для поиска:', normalizedEmail);
const userExists = await User.findOne({ email: normalizedEmail });
if (userExists) {
console.log('Пользователь с таким email уже существует');
res.status(400);
throw new Error('Пользователь с таким email уже существует.');
}
console.log('Создание нового пользователя...');
const user = await User.create({
name,
email: normalizedEmail,
password,
dateOfBirth,
gender,
});
console.log('Пользователь создан успешно:', user ? 'Да' : 'Нет', 'ID:', user ? user._id : 'N/A');
if (user) {
res.status(201).json({
_id: user._id,
name: user.name,
email: user.email,
token: generateToken(user._id),
message: 'Пользователь успешно зарегистрирован!'
});
} else {
res.status(400);
throw new Error('Неверные данные пользователя. Не удалось создать пользователя.');
}
} catch (error) {
console.error('Ошибка при регистрации:', error.message);
if (!res.statusCode || res.statusCode < 400) {
res.status(400);
}
res.json({ message: error.message, stack: process.env.NODE_ENV === 'production' ? null : error.stack });
}
};
// @desc Аутентификация пользователя и получение токена (Вход)
// @route POST /api/auth/login
// @access Public
const loginUser = async (req, res, next) => {
try {
const { email, password } = req.body;
console.log('Попытка входа с email:', email);
if (!email || !password) {
res.status(400);
throw new Error('Пожалуйста, укажите email и пароль.');
}
const normalizedEmail = email.toLowerCase();
console.log('Нормализованный email для поиска:', normalizedEmail);
const user = await User.findOne({ email: normalizedEmail }).select('+password');
console.log('Найден пользователь:', user ? 'Да' : 'Нет');
console.log('Пользователь содержит пароль:', user && user.password ? 'Да' : 'Нет');
if (!user) {
console.log('Пользователь не найден в базе данных');
res.status(401);
throw new Error('Неверный email или пароль.');
}
if (!user.password) {
console.error('Ошибка: Пароль не загружен из базы данных');
res.status(500);
throw new Error('Внутренняя ошибка сервера при проверке учетных данных.');
}
console.log('Проверка пароля...');
const isMatch = await user.matchPassword(password);
console.log('Результат проверки пароля:', isMatch ? 'Успешно' : 'Неверный пароль');
if (isMatch) {
res.status(200).json({
_id: user._id,
name: user.name,
email: user.email,
token: generateToken(user._id),
message: 'Вход выполнен успешно!'
});
} else {
res.status(401);
throw new Error('Неверный email или пароль.');
}
} catch (error) {
console.error('Ошибка при входе:', error.message);
if (!res.statusCode || res.statusCode < 400) {
res.status(401);
}
res.json({ message: error.message, stack: process.env.NODE_ENV === 'production' ? null : error.stack });
}
};
// @desc Получение данных профиля текущего пользователя
// @route GET /api/auth/me
// @access Private
const getMe = async (req, res, next) => {
try {
if (!req.user) {
res.status(404);
throw new Error('Пользователь не найден.');
}
res.status(200).json({
_id: req.user._id,
name: req.user.name,
email: req.user.email,
dateOfBirth: req.user.dateOfBirth,
gender: req.user.gender,
bio: req.user.bio,
photos: req.user.photos,
location: req.user.location,
preferences: req.user.preferences,
createdAt: req.user.createdAt,
updatedAt: req.user.updatedAt,
});
} catch (error) {
console.error('Ошибка при получении данных пользователя:', error.message);
if (!res.statusCode || res.statusCode < 400) {
res.status(500);
}
res.json({ message: error.message, stack: process.env.NODE_ENV === 'production' ? null : error.stack });
}
};
// Экспортируем все функции
module.exports = {
registerUser,
loginUser,
getMe
};