api/controllers/userController.js
2022-08-08 17:16:37 +05:30

274 lines
8.0 KiB
JavaScript

//require("dotenv").config({ path: "backend/config/config.env" });
import ErrorHander from "../Utils/errorhander.js"
import catchAsyncErrors from "../middlewares/catchAsyncErrors.js"
import User from "../models/userModel.js"
import sendToken from "../Utils/jwtToken.js"
import sendEmail from "../Utils/sendEmail.js"
import crypto from "crypto"
import cloudinary from "cloudinary"
import generator from 'generate-password'
// 1.Register a User
export const registerUser = async (req, res, next) => {
try {
const files = req.files.avatar;
const myCloud = await cloudinary.uploader.upload(files.tempFilePath, {
folder: "cmp-user/image",
},
function (error, result) { (result, error) });
const { name, email, password, phone } = req.body;
const user = await User.create({
name,
email,
password,
phone,
avatar: {
public_id: myCloud.public_id,
url: myCloud.secure_url,
},
});
sendToken(user, 201, res);
} catch (e) {
// console.log(e.message);
if (e.toString().includes('E11000 duplicate key error collection')) {
return res.status(400).json({
status: 'User Already Exists'
});
}
return res
.status(400)
.json({ status: 'Error Communicating with server' });
}
};
// 2.Login User
export const loginUser = catchAsyncErrors(async (req, res, next) => {
const { email, password } = req.body;
// checking if user has given password and email both
if (!email || !password) {
return next(res.status(400).json({ message: 'Please Enter Email & Password' }));
}
const user = await User.findOne({ email }).select("+password");
if (!user) {
return res.status(400).json({ message: 'Invalid Email or Password' });
}
const isPasswordMatched = await user.comparePassword(password);
if (!isPasswordMatched) {
return res.status(400).json({ message: 'Invalid Email or Password' });
}
// const token = user.getJWTToken();
// res.status(201).json({
// success: true,
// token,
// })
sendToken(user, 200, res);
});
// 3.Logout User
export const logout = catchAsyncErrors(async (req, res, next) => {
res.cookie("token", null, {
expires: new Date(Date.now()),
httpOnly: true,
});
res.status(200).json({
success: true,
message: "Logged Out",
});
});
// 4.Forgot Password
export const forgotPassword = catchAsyncErrors(async (req, res, next) => {
const user = await User.findOne({ email: req.body.email });
if (!user) {
return next(new ErrorHander("User not found", 404));
}
// Get ResetPassword Token
const resetToken = user.getResetPasswordToken();//call function
//save database reset token
await user.save({ validateBeforeSave: false });
//create link for send mail
// const resetPasswordUrl = `http://localhost:5000/api/v1/user/password/reset/${resetToken}` //send from localhost
//send from anyhost
// const resetPasswordUrl = `${req.protocol}://${req.get(
// "host"
// )}/api/v1/user/password/reset/${resetToken}`;
//const resetPasswordUrl = `${process.env.FRONTEND_URL}:/api/user/password/reset/${resetToken}`;
//const resetPasswordUrl = `${process.env.FRONTEND_URL}/password/reset/${resetToken}`;
const password = generator.generate({
length: 10,
numbers: true
});
user.password = password;
await user.save()
// const message = `Your password reset token are :- \n\n ${resetPasswordUrl} \n\nyour new password is:${password}\n\nIf you have not requested this email then, please ignore it.`;
try {
await sendEmail({
to: `${user.email}`, // Change to your recipient
from: 'project.edufuture@gmail.com', // Change to your verified sender
subject: `CMP Password Recovery`,
html: `your new password is: <br/> <strong> ${password}</strong><br/><br/>If you have not requested this email then, please ignore it.`
});
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 ErrorHander(error.message, 500));
}
});
// 5.Reset Password
export const resetPassword = catchAsyncErrors(async (req, res, next) => {
// creating token hash
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 ErrorHander(
"Reset Password Token is invalid or has been expired",
400
)
);
}
//replace previous password
if (req.body.password !== req.body.confirmPassword) {
return next(new ErrorHander("Password does not password", 400));
}
user.password = req.body.password;
user.resetPasswordToken = undefined;
user.resetPasswordExpire = undefined;
await user.save();
sendToken(user, 200, res);
});
//6.Get User Detail
export const getUserDetails = catchAsyncErrors(async (req, res, next) => {
const user = await User.findById(req.user.id);
res.status(200).json({
success: true,
user,
});
});
// 7.Get single user (admin)
export const getSingleUser = catchAsyncErrors(async (req, res, next) => {
const user = await User.findById(req.params.id);
if (!user) {
return next(
new ErrorHander(`User does not exist with Id: ${req.params.id}`)
);
}
res.status(200).json({
success: true,
user,
});
});
// 8.update User password
export const updatePassword = catchAsyncErrors(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 ErrorHander("Old password is incorrect", 400));
}
if (req.body.newPassword !== req.body.confirmPassword) {
return next(new ErrorHander("password does not match", 400));
}
user.password = req.body.newPassword;
await user.save();
sendToken(user, 200, res);
});
// 9.update User Profile
export const updateProfile = catchAsyncErrors(async (req, res, next) => {
const newUserData = {
name: req.body.name,
phone: req.body.phone,
email: req.body.email,
};
if (req.files) {
const files = req.files.avatar;
const user = await User.findById(req.user.id);
const imageId = user.avatar.public_id;
await cloudinary.uploader.destroy(imageId)
const myCloud = await cloudinary.uploader.upload(files.tempFilePath, {
folder: "image",
},
function (error, result) { (result, error) });
newUserData.avatar = {
public_id: myCloud.public_id,
url: myCloud.secure_url,
};
}
const user = await User.findByIdAndUpdate(req.user.id, newUserData, {
new: true,
runValidators: true,
useFindAndModify: false,
});
res.status(200).json({
success: true,
user
});
});
// 9.Get all users(admin)
export const getAllUser = catchAsyncErrors(async (req, res, next) => {
const users = await User.find()//.select('-role');
res.status(200).json({
success: true,
users,
});
});