import jwt from "jsonwebtoken"; import User from "../model/UserModel.js"; import { compare } from "bcrypt"; import { renameSync, unlinkSync } from "fs"; const maxAge = 3 * 24 * 60 * 60 * 1000; // Update createToken to include role in the token payload const createToken = (email, userId, role) => { return jwt.sign({ email, userId, role }, process.env.JWT_KEY, { expiresIn: maxAge, }); }; export const signup = async (req, res, next) => { try { const { email, password, role } = req.body; // Extract role from the request body if (email && password) { const user = await User.create({ email, password, role }); // Include role in the User creation res.cookie("jwt", createToken(email, user.id, role), { // Pass role to createToken maxAge, secure: true, sameSite: "None", }); return res.status(201).json({ user: { id: user?.id, email: user?.email, firstName: user.firstName, lastName: user.lastName, image: user.image, profileSetup: user.profileSetup, role: user.role, // Return role in the response }, }); } else { return res.status(400).send("Email and Password Required"); } } catch (err) { console.log(err); return res.status(500).send("Internal Server Error"); } }; export const login = async (req, res, next) => { try { const { email, password } = req.body; if (email && password) { const user = await User.findOne({ email }); if (!user) { return res.status(404).send("User not found"); } const auth = await compare(password, user.password); if (!auth) { return res.status(400).send("Invalid Password"); } res.cookie("jwt", createToken(email, user.id, user.role), { // Include role in token creation maxAge, secure: true, sameSite: "None", }); return res.status(200).json({ user: { id: user?.id, email: user?.email, firstName: user.firstName, lastName: user.lastName, image: user.image, profileSetup: user.profileSetup, role: user.role, // Include role in response }, }); } else { return res.status(400).send("Email and Password Required"); } } catch (err) { return res.status(500).send("Internal Server Error"); } }; export const getUserInfo = async (request, response, next) => { try { if (request.userId) { const userData = await User.findById(request.userId); if (userData) { return response.status(200).json({ id: userData?.id, email: userData?.email, firstName: userData.firstName, lastName: userData.lastName, image: userData.image, profileSetup: userData.profileSetup, color: userData.color, role: userData.role, // Return role in the user info }); } else { return response.status(404).send("User with the given id not found."); } } else { return response.status(404).send("User id not found."); } } catch (error) { console.log({ error }); return response.status(500).send("Internal Server Error"); } }; export const logout = async (request, response, next) => { try { response.cookie("jwt", "", { maxAge: 1, secure: true, sameSite: "None" }); return response.status(200).send("Logout successful"); } catch (err) { return response.status(500).send("Internal Server Error"); } }; export const updateProfile = async (request, response, next) => { try { const { userId } = request; const { firstName, lastName, color } = request.body; if (!userId) { return response.status(400).send("User ID is required."); } if (!firstName || !lastName) { return response.status(400).send("Firstname and Last name is required."); } const userData = await User.findByIdAndUpdate( userId, { firstName, lastName, color, profileSetup: true, }, { new: true, runValidators: true, } ); return response.status(200).json({ id: userData.id, email: userData.email, firstName: userData.firstName, lastName: userData.lastName, image: userData.image, profileSetup: userData.profileSetup, color: userData.color, role: userData.role, // Include role in the updated profile response }); } catch (error) { return response.status(500).send("Internal Server Error."); } }; export const addProfileImage = async (request, response, next) => { try { if (request.file) { const date = Date.now(); let fileName = "uploads/profiles/" + date + request.file.originalname; renameSync(request.file.path, fileName); const updatedUser = await User.findByIdAndUpdate( request.userId, { image: fileName }, { new: true, runValidators: true, } ); return response.status(200).json({ image: updatedUser.image }); } else { return response.status(404).send("File is required."); } } catch (error) { console.log({ error }); return response.status(500).send("Internal Server Error."); } }; export const removeProfileImage = async (request, response, next) => { try { const { userId } = request; if (!userId) { return response.status(400).send("User ID is required."); } const user = await User.findById(userId); if (!user) { return response.status(404).send("User not found."); } if (user.image) { unlinkSync(user.image); } user.image = null; await user.save(); return response .status(200) .json({ message: "Profile image removed successfully." }); } catch (error) { console.log({ error }); return response.status(500).send("Internal Server Error."); } };