You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
9.7 KiB
JavaScript
359 lines
9.7 KiB
JavaScript
1 year ago
|
// Dependencies and Modules
|
||
|
const User = require("../models/User");
|
||
|
const Course = require("../models/Course");
|
||
|
const bcrypt = require("bcrypt");
|
||
|
|
||
|
// Auth
|
||
|
const auth = require("../auth");
|
||
|
|
||
|
// Contoller function to check if email already exists
|
||
|
/*
|
||
|
Business Logic:
|
||
|
1. Use mongoose "find" method to find duplicate emails
|
||
|
2. Use the "then" method to send the response back to the frontend application based on the result of the "find" method
|
||
|
*/
|
||
|
module.exports.checkEmailExists = (reqBody) => {
|
||
|
|
||
|
return User.find({ email: reqBody.email }).then(result => {
|
||
|
|
||
|
// The "find" method returns a record if a match is found
|
||
|
// It will be returned as an array
|
||
|
// Return true if there exist an email in the DB
|
||
|
if(result.length > 0){
|
||
|
return true;
|
||
|
|
||
|
// No duplicate email found, return false
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// User registration controller
|
||
|
/*
|
||
|
MINI ACTIVITY
|
||
|
registerUser
|
||
|
Steps:
|
||
|
1. Create a new User object using the mongoose model and the information from the request body
|
||
|
- firstName
|
||
|
- lastName
|
||
|
- email
|
||
|
- mobileNo
|
||
|
- password
|
||
|
2. Make sure that the password is encrypted
|
||
|
3. Save the new User to the database
|
||
|
*/
|
||
|
module.exports.registerUser = (reqBody) => {
|
||
|
|
||
|
// Creates a variable "newUser" and instantiates a new "User" object using the mongoose model
|
||
|
// Uses the information from the request body to provide all the necessary informate
|
||
|
let newUser = new User({
|
||
|
firstName: reqBody.firstName,
|
||
|
lastName: reqBody.lastName,
|
||
|
email: reqBody.email,
|
||
|
mobileNo: reqBody.mobileNo,
|
||
|
// 10 is the value provided as the number of "salt" rounds that the bcrypt algorithm will run in order to encrypt the password
|
||
|
password: bcrypt.hashSync(reqBody.password, 10)
|
||
|
});
|
||
|
|
||
|
// Saves the created object to our database
|
||
|
return newUser.save().then((user, error) => {
|
||
|
|
||
|
// User registration fails
|
||
|
if(error){
|
||
|
return false
|
||
|
|
||
|
// User registration succeed
|
||
|
} else {
|
||
|
return true
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
// User Authentication Controller
|
||
|
/*
|
||
|
Steps:
|
||
|
1. Check the database if the user email exists
|
||
|
2. Compare the password provided in the login form with the password stored in the database.
|
||
|
3. Generate/return a JSON web token (access token) if the user is successfully logged in and return false if not
|
||
|
*/
|
||
|
module.exports.loginUser = (req, res) => {
|
||
|
|
||
|
return User.findOne({email: req.body.email}).then(result => {
|
||
|
|
||
|
// If User does not exist
|
||
|
if(result == null){
|
||
|
|
||
|
return false;
|
||
|
|
||
|
// If user exists
|
||
|
} else {
|
||
|
|
||
|
const isPasswordCorrect = bcrypt.compareSync(req.body.password, result.password);
|
||
|
|
||
|
if(isPasswordCorrect) {
|
||
|
|
||
|
res.send({
|
||
|
access: auth.createAccessToken(result)
|
||
|
});
|
||
|
} else {
|
||
|
|
||
|
return res.send(false);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Retrieve User Details Controller
|
||
|
/*
|
||
|
Steps:
|
||
|
1. Find the document in the db using the user's ID
|
||
|
2. Reassign the password of the returned document to an empty string
|
||
|
3. Return the result back to the frontend
|
||
|
*/
|
||
|
// module.exports.getProfile = (req, res) => {
|
||
|
|
||
|
// return User.findById(req.user.id).then(result => {
|
||
|
|
||
|
// // Changes the value of the user's password to an empty string for security
|
||
|
// result.password = "";
|
||
|
|
||
|
// // Returns the user information with the password as an empty string
|
||
|
// return res.send(result);
|
||
|
|
||
|
// //if there are errors finding the document
|
||
|
// }).catch(error => res.send(error));
|
||
|
// }
|
||
|
|
||
|
// // Enroll User to a Course
|
||
|
// /*
|
||
|
// Steps:
|
||
|
// 1. Find the document in the db using the user's ID
|
||
|
// 2. Add the course ID to the user's enrollment array
|
||
|
// 3. Update the document in the MongoDB database
|
||
|
// */
|
||
|
// module.exports.enroll = async (req, res) => {
|
||
|
|
||
|
|
||
|
// // The admin is not allowed to enroll to a course
|
||
|
// if(req.user.isAdmin){
|
||
|
// return res.send("Action forbidden")
|
||
|
// }
|
||
|
|
||
|
// // Store the value true to the isUserUpdated variable if the enrollment is successful
|
||
|
// let isUserUpdated = await User.findById(req.user.id).then(user => {
|
||
|
|
||
|
// // Add the courseId in an object and push that object into the user's enrollment array
|
||
|
// let newEnrollment = {
|
||
|
// courseId: req.body.courseId,
|
||
|
// courseName: req.body.courseName,
|
||
|
// courseDescription: req.body.courseDescription,
|
||
|
// coursePrice: req.body.coursePrice
|
||
|
// }
|
||
|
|
||
|
// user.enrollments.push(newEnrollment);
|
||
|
|
||
|
// // Return true if the saving is successful or return the error message if there are errors
|
||
|
// return user.save().then(user => true).catch(error => error.message);
|
||
|
|
||
|
// });
|
||
|
|
||
|
|
||
|
// // Checks if isUserUpdated is not true
|
||
|
// if(isUserUpdated !== true){
|
||
|
|
||
|
// return res.send({
|
||
|
// message: isUserUpdated
|
||
|
// });
|
||
|
// }
|
||
|
|
||
|
// // Find the course and update the enrollees array of that course with the user id
|
||
|
// let isCourseUpdated = await Course.findById(req.body.courseId).then(course => {
|
||
|
|
||
|
// let enrollee = {
|
||
|
// userId: req.user.id
|
||
|
// }
|
||
|
|
||
|
// course.enrollees.push(enrollee);
|
||
|
|
||
|
// return course.save().then(course => true).catch(error => error.message);
|
||
|
|
||
|
// });
|
||
|
|
||
|
|
||
|
// // Check if there was an error saving our course document
|
||
|
// if(isCourseUpdated !== true){
|
||
|
// return res.send({
|
||
|
// message: isCourseUpdated
|
||
|
// });
|
||
|
// }
|
||
|
|
||
|
// // Checks if isUserUpdated and isCourseUpdated is true, then the enrollment is successful
|
||
|
// if(isUserUpdated && isCourseUpdated){
|
||
|
// return res.send({
|
||
|
// message: "Enrolled Successfully."
|
||
|
// });
|
||
|
// }
|
||
|
|
||
|
|
||
|
// }
|
||
|
|
||
|
|
||
|
// // Function to reset the password
|
||
|
// module.exports.resetPassword = async (req, res) => {
|
||
|
// try {
|
||
|
// const { newPassword } = req.body;
|
||
|
// const { id } = req.user; // Extracting user ID from the authorization header
|
||
|
|
||
|
// // Hashing the new password
|
||
|
// const hashedPassword = await bcrypt.hash(newPassword, 10);
|
||
|
|
||
|
// // Updating the user's password in the database
|
||
|
// await User.findByIdAndUpdate(id, { password: hashedPassword });
|
||
|
|
||
|
// // Sending a success response
|
||
|
// res.status(200).json({ message: 'Password reset successfully' });
|
||
|
// } catch (error) {
|
||
|
// console.error(error);
|
||
|
// res.status(500).json({ message: 'Internal server error' });
|
||
|
// }
|
||
|
// };
|
||
|
|
||
|
|
||
|
// // Controller function to update the user profile
|
||
|
// module.exports.updateProfile = async (req, res) => {
|
||
|
// try {
|
||
|
// // Get the user ID from the authenticated token
|
||
|
// const userId = req.user.id;
|
||
|
|
||
|
// // Retrieve the updated profile information from the request body
|
||
|
// const { firstName, lastName, mobileNo } = req.body;
|
||
|
|
||
|
// // Update the user's profile in the database
|
||
|
// const updatedUser = await User.findByIdAndUpdate(
|
||
|
// userId,
|
||
|
// { firstName, lastName, mobileNo },
|
||
|
// { new: true }
|
||
|
// );
|
||
|
|
||
|
// res.json(updatedUser);
|
||
|
// } catch (error) {
|
||
|
// console.error(error);
|
||
|
// res.status(500).json({ message: 'Failed to update profile' });
|
||
|
// }
|
||
|
// };
|
||
|
|
||
|
|
||
|
// module.exports.getEnrollments = (req, res) => {
|
||
|
|
||
|
// return User.findById(req.user.id).then(foundUser => {
|
||
|
// return res.send(foundUser.enrollments);
|
||
|
// })
|
||
|
|
||
|
// };
|
||
|
|
||
|
// module.exports.resetPassword = async (req, res) => {
|
||
|
// try {
|
||
|
// const password = req.body.password;
|
||
|
// console.log(password);
|
||
|
// let userId = req.user.id; // Extracting user ID from the authorization header
|
||
|
// console.log(userId);
|
||
|
// // Hashing the new password
|
||
|
// let hashedPassword = bcrypt.hashSync(password, 10);
|
||
|
// console.log(hashedPassword);
|
||
|
// // Updating the user's password in the database
|
||
|
// return User.findByIdAndUpdate(userId, { password: hashedPassword }).then(result => {
|
||
|
// return res.send(result);
|
||
|
// })
|
||
|
// // Sending a success response
|
||
|
// }
|
||
|
// catch(error) {
|
||
|
// return res.send(error);
|
||
|
// }
|
||
|
|
||
|
// }
|
||
|
|
||
|
// module.exports.updateProfile = async (req, res) => {
|
||
|
// try {
|
||
|
// // Get the user ID from the authenticated token
|
||
|
// let userId = req.user.id;
|
||
|
|
||
|
// // Retrieve the updated profile information from the request body
|
||
|
// let { firstName, lastName, mobileNumber, email } = req.body;
|
||
|
|
||
|
// // Update the user's profile in the database
|
||
|
// const updatedUser = await User.findByIdAndUpdate(
|
||
|
// userId,
|
||
|
// { firstName, lastName, email, mobileNumber },
|
||
|
// { new: true }
|
||
|
// );
|
||
|
|
||
|
// res.json(updatedUser);
|
||
|
// } catch (error) {
|
||
|
// console.error(error);
|
||
|
// res.status(500).json({ message: 'Failed to update profile' });
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// module.exports.updateEnrollmentStatus = async (req,res) => {
|
||
|
// try {
|
||
|
// const { userId, courseId } = req.body;
|
||
|
// const { updatedStatus } = req.body;
|
||
|
|
||
|
// // Check if the user and course exist
|
||
|
// const user = await User.findById(userId);
|
||
|
// if (!user) {
|
||
|
// return res.status(404).json({ message: 'User not found.' });
|
||
|
// }
|
||
|
|
||
|
// const courseIndex = user.enrollments.findIndex((enrollment) => enrollment.courseId === courseId);
|
||
|
|
||
|
// if (courseIndex === -1) {
|
||
|
// return res.status(404).json({ message: 'Course not found in user\'s enrollments.' });
|
||
|
// }
|
||
|
// // Update the enrollment status
|
||
|
// user.enrollments[courseIndex].status = updatedStatus;
|
||
|
|
||
|
// // Save the updated user object
|
||
|
// await user.save();
|
||
|
|
||
|
// res.status(200).json({ message: 'Enrollment status updated successfully.' });
|
||
|
// } catch (err) {
|
||
|
// console.error(err);
|
||
|
// res.status(500).json({ message: 'Internal server error.' });
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
|
||
|
// Controller function to update a user as an admin
|
||
|
// exports.updateUserAsAdmin = async (req, res) => {
|
||
|
// try {
|
||
|
// const { userId } = req.body;
|
||
|
|
||
|
// // Find the user by userId
|
||
|
// const user = await User.findById(userId);
|
||
|
|
||
|
// if (!user) {
|
||
|
// return res.status(404).json({ message: 'User not found' });
|
||
|
// }
|
||
|
|
||
|
// // Update the user as an admin
|
||
|
// user.isAdmin = true;
|
||
|
// await user.save();
|
||
|
|
||
|
// res.status(200).json({ message: 'User updated as admin successfully' });
|
||
|
// } catch (error) {
|
||
|
// console.error(error);
|
||
|
// res.status(500).json({ message: 'An error occurred while updating the user as admin' });
|
||
|
// }
|
||
|
// };
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|