// Контроллер аутентификации 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 };