http-response-handler
Version:
A comprehensive utility for standardizing HTTP responses in Node.js applications
255 lines (203 loc) • 7.59 kB
JavaScript
import User from "../Models/User.js";
import bcrypt from "bcryptjs";
import jwt from "jsonwebtoken";
// Function to generate JWT token
const generateAuthToken = (user) => {
return jwt.sign({ userId: user._id }, process.env.JWT_SECRET, {
expiresIn: "1d",
});
};
// register API
export const addUser = async (req, res) => {
try {
const { username, email, password, mobile, role} = req.body;
const existingUser = await User.findOne({ email });
if (existingUser) {
return res.status(400).json({ message: "Email is already in use" });
}
const existingUserName = await User.findOne({ username });
if (existingUserName) {
return res.status(400).json({ message: "Username is already in use" });
}
console.log("user", email, password,)
const hashedPassword = await bcrypt.hash(password, 10);
const user = new User({
username,
email,
password: hashedPassword,
role,
mobile,
});
await user.save();
console.log("user", user)
res.status(201).json({ message: "User created successfully", user });
} catch (error) {
res.status(400).json({ message: error.message });
}
};
// login API
// export const loginUser = async (req, res) => {
// try {
// const { email, password } = req.body;
// let user;
// console.log("user", email, password)
// if (email) {
// user = await User.findOne({ email });
// }
// if (!user || (password && !bcrypt.compareSync(password, user.password))) {
// return res.status(401).json({ message: 'Invalid credentials' });
// }
// // Check if the user object contains the _id property
// if (!user._id) {
// return res.status(401).json({ message: 'User ID not found' });
// }
// const token = generateAuthToken(user);
// res.status(200).json({ message: 'Login successful', user, token });
// } catch (error) {
// res.status(500).json({ message: error.message });
// }
// };
export const loginUser = async (req, res) => {
try {
const { email, password } = req.body;
// Step 1: Validate input
if (!email || !password) {
return res.status(400).json({ message: 'Email and password are required' });
}
// Step 2: Find the user by email
const user = await User.findOne({ email });
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
// Step 3: Compare the provided password with the stored hashed password
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).json({ message: 'Invalid credentials' });
}
// Step 4: Generate a JWT token
const payload = {
userId: user._id,
email: user.email,
role: user.role, // You can also include other user data if needed
};
const token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' });
// Step 5: Respond with the token and user info (excluding the password)
const { password: _, ...userData } = user.toObject();
res.status(200).json({
message: 'Login successful',
token, // Send the token
user: userData, // Return the user data without the password
});
} catch (error) {
console.error(error); // Log error for debugging
res.status(500).json({
message: process.env.NODE_ENV === 'production'
? 'An unexpected error occurred'
: error.message,
});
}
};
export const updateUser = async (req, res) => {
try {
const { userId } = req.params;
let updateData = req.body;
// Update user and return the new user data
const user = await User.findByIdAndUpdate(userId, updateData, { new: true });
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
res.status(200).json({ message: 'User updated successfully', user });
} catch (error) {
res.status(400).json({ message: error.message });
}
};
// get all user
// here some time i comment role bcz some issue
export const getAllUsers = async (req, res) => {
try {
const query = req.query.user;
// const users = await User.find({ role: query });
const users = await User.find();
console.log(users,"users")
const userCount = users.length; // Count the number of users
res.status(200).json({ totalUsers: userCount, users });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
// get user by ID
export const getUser = async (req, res) => {
try {
const userId = req.params.id;
const user = await User.findById(userId);
if (!user) {
return res.status(404).json({ message: "User not found" });
}
res.json(user);
} catch (error) {
res.status(500).json({ message: error.message });
}
};
// Delete user by ID
export const deleteUser = async (req, res) => {
try {
const userId = req.params.userId;
console.log(userId,"userId");
const user = await User.findByIdAndDelete(userId);
console.log(user,"user");
if (!user) {
return res.status(404).json({ message: "User not found" });
}
res.json({ message: "User deleted successfully", user });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
// reset password -> send otp as a responce
export const resetPassword = async (req, res) => {
try {
const { mobile } = req.body;
const user = await User.findOne({ mobile });
console.log(user,"user")
if (!user) {
return res.status(404).json({ message: 'User mobile No. not found' });
}
const generateOTP = () => {
return Math.floor(100000 + Math.random() * 900000);
};
const otp = generateOTP();
//user.forgotPasswordOTP = otp;
await user.save();
//console.log(otp);
// await client.messages.create({
// body: `Your OTP for password reset is: ${otp}`,
// to: user.mobile
// });
res.json({ message: "OTP sent successfully", otp: otp });
} catch (error) {
console.error(error);
res.status(500).json({ error: "Internal Server Error" || error.message });
}
}
// check otp in reset time
export const resetPasswordOtpVerify = async (req, res) => {
try {
const { email, otp, newPassword } = req.body;
const user = await User.findOne({ email });
if (!user) {
return res.status(404).json({ message: 'User not found' });
}
// Check if OTP matches
if (!user.forgotPasswordOTP === otp) {
return res.status(400).json({ message: 'Invalid OTP' });
}
// If OTP is valid, reset password
const salt = await bcrypt.genSalt(10);
const hasPassword = await bcrypt.hash(newPassword, salt);
await User.findByIdAndUpdate(user._id, { password: hasPassword, forgotPasswordOTP: null }, { new: true });
res.json({ message: 'Password reset successfully' });
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Internal Server Error' });
}
};