Initial Version
This commit is contained in:
262
server/controllers/userController.js
Normal file
262
server/controllers/userController.js
Normal file
@@ -0,0 +1,262 @@
|
||||
const User = require('../models/userModel');
|
||||
const asyncErrorHandler = require('../middlewares/helpers/asyncErrorHandler');
|
||||
const sendToken = require('../utils/sendToken');
|
||||
const ErrorHandler = require('../utils/errorHandler');
|
||||
const sendEmail = require('../utils/sendEmail');
|
||||
const crypto = require('crypto');
|
||||
const cloudinary = require('cloudinary');
|
||||
|
||||
// Register User
|
||||
exports.registerUser = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const myCloud = await cloudinary.v2.uploader.upload(req.body.avatar, {
|
||||
folder: "avatars",
|
||||
width: 150,
|
||||
crop: "scale",
|
||||
});
|
||||
|
||||
const { name, email, gender, password } = req.body;
|
||||
|
||||
const user = await User.create({
|
||||
name,
|
||||
email,
|
||||
gender,
|
||||
password,
|
||||
avatar: {
|
||||
public_id: myCloud.public_id,
|
||||
url: myCloud.secure_url,
|
||||
},
|
||||
});
|
||||
|
||||
sendToken(user, 201, res);
|
||||
});
|
||||
|
||||
// Login User
|
||||
exports.loginUser = asyncErrorHandler(async (req, res, next) => {
|
||||
const { email, password } = req.body;
|
||||
|
||||
if(!email || !password) {
|
||||
return next(new ErrorHandler("Please Enter Email And Password", 400));
|
||||
}
|
||||
|
||||
const user = await User.findOne({ email}).select("+password");
|
||||
|
||||
if(!user) {
|
||||
return next(new ErrorHandler("Invalid Email or Password", 401));
|
||||
}
|
||||
|
||||
const isPasswordMatched = await user.comparePassword(password);
|
||||
|
||||
if(!isPasswordMatched) {
|
||||
return next(new ErrorHandler("Invalid Email or Password", 401));
|
||||
}
|
||||
|
||||
sendToken(user, 201, res);
|
||||
});
|
||||
|
||||
// Logout User
|
||||
exports.logoutUser = asyncErrorHandler(async (req, res, next) => {
|
||||
res.cookie("token", null, {
|
||||
expires: new Date(Date.now()),
|
||||
httpOnly: true,
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: "Logged Out",
|
||||
});
|
||||
});
|
||||
|
||||
// Get User Details
|
||||
exports.getUserDetails = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const user = await User.findById(req.user.id);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
user,
|
||||
});
|
||||
});
|
||||
|
||||
// Forgot Password
|
||||
exports.forgotPassword = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const user = await User.findOne({email: req.body.email});
|
||||
|
||||
if(!user) {
|
||||
return next(new ErrorHandler("User Not Found", 404));
|
||||
}
|
||||
|
||||
const resetToken = await user.getResetPasswordToken();
|
||||
|
||||
await user.save({ validateBeforeSave: false });
|
||||
|
||||
// const resetPasswordUrl = `${req.protocol}://${req.get("host")}/password/reset/${resetToken}`;
|
||||
const resetPasswordUrl = `https://${req.get("host")}/password/reset/${resetToken}`;
|
||||
|
||||
// const message = `Your password reset token is : \n\n ${resetPasswordUrl}`;
|
||||
|
||||
try {
|
||||
await sendEmail({
|
||||
email: user.email,
|
||||
templateId: process.env.SENDGRID_RESET_TEMPLATEID,
|
||||
data: {
|
||||
reset_url: resetPasswordUrl
|
||||
}
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: `Email sent to ${user.email} successfully`,
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
user.resetPasswordToken = undefined;
|
||||
user.resetPasswordExpire = undefined;
|
||||
|
||||
await user.save({ validateBeforeSave: false });
|
||||
return next(new ErrorHandler(error.message, 500))
|
||||
}
|
||||
});
|
||||
|
||||
// Reset Password
|
||||
exports.resetPassword = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
// create hash token
|
||||
const resetPasswordToken = crypto.createHash("sha256").update(req.params.token).digest("hex");
|
||||
|
||||
const user = await User.findOne({
|
||||
resetPasswordToken,
|
||||
resetPasswordExpire: { $gt: Date.now() }
|
||||
});
|
||||
|
||||
if(!user) {
|
||||
return next(new ErrorHandler("Invalid reset password token", 404));
|
||||
}
|
||||
|
||||
user.password = req.body.password;
|
||||
user.resetPasswordToken = undefined;
|
||||
user.resetPasswordExpire = undefined;
|
||||
|
||||
await user.save();
|
||||
sendToken(user, 200, res);
|
||||
});
|
||||
|
||||
// Update Password
|
||||
exports.updatePassword = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const user = await User.findById(req.user.id).select("+password");
|
||||
|
||||
const isPasswordMatched = await user.comparePassword(req.body.oldPassword);
|
||||
|
||||
if(!isPasswordMatched) {
|
||||
return next(new ErrorHandler("Old Password is Invalid", 400));
|
||||
}
|
||||
|
||||
user.password = req.body.newPassword;
|
||||
await user.save();
|
||||
sendToken(user, 201, res);
|
||||
});
|
||||
|
||||
// Update User Profile
|
||||
exports.updateProfile = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const newUserData = {
|
||||
name: req.body.name,
|
||||
email: req.body.email,
|
||||
}
|
||||
|
||||
if(req.body.avatar !== "") {
|
||||
const user = await User.findById(req.user.id);
|
||||
|
||||
const imageId = user.avatar.public_id;
|
||||
|
||||
await cloudinary.v2.uploader.destroy(imageId);
|
||||
|
||||
const myCloud = await cloudinary.v2.uploader.upload(req.body.avatar, {
|
||||
folder: "avatars",
|
||||
width: 150,
|
||||
crop: "scale",
|
||||
});
|
||||
|
||||
newUserData.avatar = {
|
||||
public_id: myCloud.public_id,
|
||||
url: myCloud.secure_url,
|
||||
}
|
||||
}
|
||||
|
||||
await User.findByIdAndUpdate(req.user.id, newUserData, {
|
||||
new: true,
|
||||
runValidators: true,
|
||||
useFindAndModify: true,
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
});
|
||||
});
|
||||
|
||||
// ADMIN DASHBOARD
|
||||
|
||||
// Get All Users --ADMIN
|
||||
exports.getAllUsers = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const users = await User.find();
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
users,
|
||||
});
|
||||
});
|
||||
|
||||
// Get Single User Details --ADMIN
|
||||
exports.getSingleUser = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const user = await User.findById(req.params.id);
|
||||
|
||||
if(!user) {
|
||||
return next(new ErrorHandler(`User doesn't exist with id: ${req.params.id}`, 404));
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
user,
|
||||
});
|
||||
});
|
||||
|
||||
// Update User Role --ADMIN
|
||||
exports.updateUserRole = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const newUserData = {
|
||||
name: req.body.name,
|
||||
email: req.body.email,
|
||||
gender: req.body.gender,
|
||||
role: req.body.role,
|
||||
}
|
||||
|
||||
await User.findByIdAndUpdate(req.params.id, newUserData, {
|
||||
new: true,
|
||||
runValidators: true,
|
||||
useFindAndModify: false,
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
});
|
||||
});
|
||||
|
||||
// Delete Role --ADMIN
|
||||
exports.deleteUser = asyncErrorHandler(async (req, res, next) => {
|
||||
|
||||
const user = await User.findById(req.params.id);
|
||||
|
||||
if(!user) {
|
||||
return next(new ErrorHandler(`User doesn't exist with id: ${req.params.id}`, 404));
|
||||
}
|
||||
|
||||
await user.remove();
|
||||
|
||||
res.status(200).json({
|
||||
success: true
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user