Files
2026-03-10 03:45:00 +09:00

262 lines
6.5 KiB
JavaScript

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
});
});