237 lines
6.9 KiB
JavaScript
237 lines
6.9 KiB
JavaScript
import dotenv from "dotenv";
|
|
import UserModal from "../models/user.js";
|
|
import mongoose from 'mongoose';
|
|
import bcrypt from "bcryptjs";
|
|
import jwt from "jsonwebtoken";
|
|
import { sendEmail } from "../utils/sendEmail.js";
|
|
|
|
dotenv.config();
|
|
const secret = process.env.SECRET_KEY;
|
|
|
|
// This is signup
|
|
export const signup = async (req, res) => {
|
|
const { title, email, password, firstName, middleName, lastName, termsconditions, userType } = req.body;
|
|
|
|
function generateRandomNumber() {
|
|
return Math.floor(Math.random() * 90000) + 10000;
|
|
}
|
|
|
|
try {
|
|
// Check if user already exists
|
|
const oldUser = await UserModal.findOne({ email });
|
|
if (oldUser) {
|
|
return res.status(400).json({ message: "User already exists" });
|
|
}
|
|
|
|
// Hash the password
|
|
const hashedPassword = await bcrypt.hash(password, 12);
|
|
const randomNumber = generateRandomNumber().toString();
|
|
const userId = `ELUI${randomNumber}`;
|
|
|
|
// Create new user
|
|
const result = await UserModal.create({
|
|
title,
|
|
email,
|
|
password: hashedPassword,
|
|
firstName,
|
|
middleName,
|
|
lastName,
|
|
termsconditions,
|
|
userType,
|
|
userId:userId,
|
|
});
|
|
|
|
// Generate JWT (if needed)
|
|
const token = jwt.sign({ email: result.email, id: result._id }, secret, { expiresIn: "7h" });
|
|
|
|
// Save the token in the user's tokens array
|
|
result.tokens.push({ token });
|
|
await result.save();
|
|
|
|
const url = `Click on the link ${process.env.RETURN_URL}/users/${result._id}/verify/${token}`;
|
|
await sendEmail(result.email, "Verify Email", url);
|
|
|
|
// Send the user info and token back to the client
|
|
res.status(201).json({ result, token });
|
|
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ message: "Something went wrong" });
|
|
}
|
|
};
|
|
|
|
//This is to verify user
|
|
|
|
export const verifyUser = async (req, res) => {
|
|
try {
|
|
const user = await UserModal.findOne({ _id: req.params.id });
|
|
if (!user) return res.status(400).send({ message: "Invalid link" });
|
|
|
|
const token = user.tokens.find(
|
|
(tokenObj) => tokenObj.token === req.params.token
|
|
);
|
|
if (!token) return res.status(400).send({ message: "Invalid link" });
|
|
|
|
// Update the user's verified status to true
|
|
user.verified = true;
|
|
await user.save();
|
|
|
|
// Remove the token from the tokens array
|
|
user.tokens = user.tokens.filter(
|
|
(tokenObj) => tokenObj.token !== req.params.token
|
|
);
|
|
await user.save();
|
|
|
|
res.status(200).send({ message: "Email verified successfully" });
|
|
} catch (error) {
|
|
res.status(500).send({ message: "Internal Server Errors" });
|
|
}
|
|
};
|
|
|
|
// This is signIn
|
|
export const signin = async (req, res) => {
|
|
const { email, password } = req.body;
|
|
|
|
try {
|
|
const oldUser = await UserModal.findOne({ email });
|
|
if (!oldUser)
|
|
return res.status(404).json({ message: "User doesn't exist" });
|
|
|
|
const isPasswordCorrect = await bcrypt.compare(password, oldUser.password);
|
|
|
|
if (!isPasswordCorrect)
|
|
return res.status(400).json({ message: "Invalid credentials" });
|
|
|
|
if (!oldUser.verified) {
|
|
return res.status(401).json({ message: "User is not verified" });
|
|
}
|
|
|
|
const token = jwt.sign({ email: oldUser.email, id: oldUser._id }, secret, {
|
|
expiresIn: "8h",
|
|
});
|
|
|
|
res.status(200).json({ result: oldUser, token });
|
|
} catch (error) {
|
|
res.status(500).json({ message: "Something went wrong" });
|
|
console.log(error);
|
|
}
|
|
};
|
|
|
|
//To show user
|
|
|
|
export const showUser = async (req, res) => {
|
|
const { userId } = req.params;
|
|
|
|
// Optional: Validate if userId is a MongoDB ObjectId
|
|
if (mongoose.Types.ObjectId.isValid(userId)) {
|
|
try {
|
|
const user = await UserModal.findById(userId);
|
|
if (!user) {
|
|
return res.status(404).json({ message: 'User not found' });
|
|
}
|
|
return res.json(user);
|
|
} catch (error) {
|
|
return res.status(500).json({ message: 'Server Error' });
|
|
}
|
|
} else {
|
|
// If the userId is not an ObjectId, search by other fields (e.g., custom userId)
|
|
try {
|
|
const user = await UserModal.findOne({ userId }); // Adjust based on how your schema stores userId
|
|
if (!user) {
|
|
return res.status(404).json({ message: 'User not found' });
|
|
}
|
|
return res.json(user);
|
|
} catch (error) {
|
|
return res.status(500).json({ message: 'Server Error' });
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
|
|
//forgot password
|
|
|
|
export const forgotPassword = async (req, res) => {
|
|
const { email } = req.body;
|
|
|
|
try {
|
|
const user = await UserModal.findOne({ email });
|
|
if (!user) {
|
|
return res.status(404).json({ message: "User not found" });
|
|
}
|
|
|
|
const secrets = secret + user.password;
|
|
const token = jwt.sign({ email: user.email, id: user._id }, secrets, {
|
|
expiresIn: "5m",
|
|
});
|
|
user.resetToken = token;
|
|
user.resetTokenExpiration = Date.now() + 300000; // 5 minutes
|
|
await user.save();
|
|
res.status(200).send({ message: "Reset Email alert sent successfully" });
|
|
|
|
const url = `CLick on the link ${process.env.RETURN_URL}/users/resetpassword/${user._id}/${token}`;
|
|
|
|
await sendEmail(user.email, "Reset Email", url);
|
|
// res.json({ message: 'Password reset successful' });
|
|
} catch (err) {
|
|
console.error("Forgot Password Error:", err);
|
|
res.status(500).json({ message: "Something went wrong" });
|
|
}
|
|
};
|
|
|
|
// To reset password
|
|
|
|
export const resetPassword = async (req, res) => {
|
|
const { id, token } = req.params;
|
|
const { password } = req.body;
|
|
|
|
try {
|
|
if (!password || password.trim() === "") {
|
|
return res.status(400).json({ message: "Password not entered" });
|
|
}
|
|
|
|
const user = await UserModal.findOne({ _id: id });
|
|
if (!user) {
|
|
return res.json({ status: "User Not Exists!!" });
|
|
}
|
|
|
|
// Update the user's password and clear the reset token
|
|
user.password = await bcrypt.hash(password, 12);
|
|
// user.resetToken = undefined;
|
|
// user.resetTokenExpiration = undefined;
|
|
user.resetToken = token;
|
|
user.resetTokenExpiration = Date.now() + 300000; // 5 minutes
|
|
|
|
await user.save();
|
|
|
|
res.json({ message: "Password reset successful" });
|
|
} catch (err) {
|
|
console.error("Password Reset Error:", err);
|
|
res.status(500).json({ message: "Something went wrong" });
|
|
}
|
|
};
|
|
|
|
|
|
// Update user controller
|
|
|
|
export const updateUser = async (req, res) => {
|
|
try {
|
|
const { userId, title, firstName, middleName, lastName, email, aboutme, profileImage } = req.body;
|
|
// Use findOneAndUpdate instead, querying by userId (custom field)
|
|
const updatedUser = await UserModal.findOneAndUpdate(
|
|
{ userId }, // Query by custom userId, not ObjectId
|
|
{ title, firstName, middleName, lastName, email, aboutme, profileImage },
|
|
{ new: true } // Return the updated document
|
|
);
|
|
|
|
if (!updatedUser) {
|
|
return res.status(404).json({ message: "User not found" });
|
|
}
|
|
|
|
res.status(200).json(updatedUser);
|
|
} catch (error) {
|
|
console.error("Error updating user:", error);
|
|
res.status(500).json({ message: "Error updating user", error });
|
|
}
|
|
};
|