import User from '../models/userModel.js' import asyncHandler from '../middleware/asyncHandler.js' import bcrypt from 'bcryptjs' import createToken from '../utils/createToken.js' const createUser = asyncHandler(async (req, res) => { const { username, email, password, isAdmin } = req.body if (!username || !email || !password) { throw new Error('Please fill all the inputs') } const userExists = await User.findOne({ email }) if (userExists) { res.status(400) throw new Error("User already exist") } const salt = await bcrypt.genSalt(10) const hashedPassword = await bcrypt.hash(password, salt) const newUser = new User({ username, email, password: hashedPassword, isAdmin: isAdmin }) try { await newUser.save() // generateToken createToken(res, newUser._id) res.status(201).json({ _id: newUser._id, username: newUser.username, email: newUser.email, isAdmin: newUser.isAdmin }) } catch (error) { res.status(400) throw new Error("Invalid user data") } }) const loginUser = asyncHandler(async (req, res) => { const { email, password } = req.body const existingUser = await User.findOne({ email }) if (existingUser) { const isPasswordValid = await bcrypt.compare(password, existingUser.password) if (isPasswordValid) { createToken(res, existingUser._id) res.status(201).json({ _id: existingUser._id, username: existingUser.username, email: existingUser.email, isAdmin: existingUser.isAdmin }) } else { res.status(400) throw new Error("Wrong Password") } } }) const logoutCurrentUser = asyncHandler(async (req, res) => { res.cookie('jwt', '', { httpOnly: true, expires: new Date(0) }) res.status(200).json({ message: "Logged out sucessfully -cookie removed-" }) }) const getAllUsers = asyncHandler(async (req, res) => { const users = await User.find({}) res.json(users) }) const getCurrentUserProfile = asyncHandler(async (req, res) => { const user = await User.findById(req.user._id) if (user) { res.json({ _id: user._id, username: user.username, email: user.email }) } else { res.status(404) throw new Error("User not found") } }) const updateCurrentUserProfile = asyncHandler(async (req, res) => { const user = await User.findById(req.user._id) if (user) { user.username = req.body.username || user.username user.email = req.body.email || user.email if (req.body.password) { const salt = await bcrypt.genSalt(10) const hashedPassword = await bcrypt.hash(req.body.password, salt) user.password = hashedPassword } const updatedUser = await user.save() res.json({ _id: updatedUser._id, username: updatedUser.username, email: updatedUser.email, isAdmin: updatedUser.isAdmin }) } else { res.status(404) throw new Error("User not found") } }) const deletUserById = asyncHandler(async(req, res) => { const user = await User.findById(req.params.id) if(user){ if(user.isAdmin){ res.status(400) throw new Error('Cannot delete admin user') } await User.deleteOne({_id: user._id}) res.json({message: "User removed"}) } else { res.status(404) throw new Error("User not found") } }) const getUserById = asyncHandler(async(req, res) => { const user = await User.findById(req.params.id).select('-password') if(user){ res.json(user) } else { res.status(404) throw new Error("User not found") } }) const updateUserById = asyncHandler(async(req, res) => {{ const user = await User.findById(req.params.id) if(user){ user.username = req.body.username || user.username user.email = req.body.email || user.email user.isAdmin = Boolean(req.body.isAdmin) const updatedUser = await user.save() res.json({ _id: updatedUser._id, username: updatedUser.username, email:updatedUser.email, isAdmin: updatedUser.isAdmin }) } else { res.status(404) throw new Error("User not found") } }}) export { createUser, loginUser, logoutCurrentUser, getAllUsers, getCurrentUserProfile, updateCurrentUserProfile, deletUserById, getUserById, updateUserById }