UNPKG

http-response-handler

Version:

A comprehensive utility for standardizing HTTP responses in Node.js applications

255 lines (203 loc) 7.59 kB
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' }); } };