const User = require('../models/User'); const { generateToken } = require('../utils/jwt'); const { successResponse, errorResponse } = require('../utils/apiResponse'); // @desc Register new user // @route POST /api/auth/register // @access Public const registerUser = async (req, res, next) => { try { const { name, email, password, phone } = req.body; const userExists = await User.findOne({ email: email.toLowerCase() }); if (userExists) { return errorResponse(res, 'User already exists with this email', [], 400); } const user = await User.create({ name, email, password, phone: phone || '' }); const token = generateToken(user._id, user.role); return successResponse(res, 'Registration successful', { _id: user._id, name: user.name, email: user.email, role: user.role, token }, 201); } catch (error) { next(error); } }; // @desc Login user & get token // @route POST /api/auth/login // @access Public const loginUser = async (req, res, next) => { try { const { email, password } = req.body; if (!email || !password) { return errorResponse(res, 'Please provide email and password', [], 400); } const user = await User.findOne({ email: email.toLowerCase() }).select('+password'); if (!user || !(await user.matchPassword(password))) { return errorResponse(res, 'Invalid credentials', [], 401); } const token = generateToken(user._id, user.role); return successResponse(res, 'Login successful', { _id: user._id, name: user.name, email: user.email, role: user.role, avatar: user.avatar, addresses: user.addresses, token }); } catch (error) { next(error); } }; // @desc Get user profile // @route GET /api/auth/profile // @access Private const getUserProfile = async (req, res, next) => { try { const user = await User.findById(req.user._id); if (!user) { return errorResponse(res, 'User not found', [], 404); } return successResponse(res, 'User profile retrieved', user); } catch (error) { next(error); } }; // @desc Update user profile & addresses // @route PUT /api/auth/profile // @access Private const updateUserProfile = async (req, res, next) => { try { const user = await User.findById(req.user._id); if (!user) { return errorResponse(res, 'User not found', [], 404); } user.name = req.body.name || user.name; user.phone = req.body.phone !== undefined ? req.body.phone : user.phone; if (req.body.addresses) { user.addresses = req.body.addresses; } if (req.body.password) { user.password = req.body.password; } const updatedUser = await user.save(); const token = generateToken(updatedUser._id, updatedUser.role); return successResponse(res, 'Profile updated successfully', { _id: updatedUser._id, name: updatedUser.name, email: updatedUser.email, role: updatedUser.role, phone: updatedUser.phone, addresses: updatedUser.addresses, token }); } catch (error) { next(error); } }; module.exports = { registerUser, loginUser, getUserProfile, updateUserProfile };