You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
4.7 KiB
JavaScript

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
}