frontend-app / server /controllers /AuthController.js
Keys
fixes
2ecbb66
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.");
}
};