diff --git a/PROF-XXI FW Tool/server/controllers/user.js b/PROF-XXI FW Tool/server/controllers/user.js new file mode 100644 index 0000000000000000000000000000000000000000..d1b0834f2c48733c5958a64356765432a9570714 --- /dev/null +++ b/PROF-XXI FW Tool/server/controllers/user.js @@ -0,0 +1,322 @@ +const crypto = require("crypto"); +const bcrypt = require("bcrypt"); +const db = require("../database/database"); +const jwt = require("jsonwebtoken"); +const sendEmail = require("../utils/sendEmail"); +const saltRounds = 10; + +exports.register = async (req, res) => { + const user = req.body.user; + try { + db.query( + "SELECT * from users WHERE email= ?", + [user.email], + (err, result) => { + if (err) { + res.json({ message: err }); + } else { + if (result.length > 0) { + res.json({ + message: + "A user with this email is already created, please change the email", + }); + } else { + bcrypt.hash(user.password, saltRounds, (err, hash) => { + db.query( + "INSERT INTO users (email, firstName, password, position, organizationName, lastName, profile, universityWebsite) VALUES (?,?,?,?,?,?,?,?) ", + [ + user.email, + user.firstName, + hash, + user.position, + user.organizationName, + user.lastName, + user.profile, + user.universityWebsite, + ], + (err, result) => { + if (err) { + res.json({ message: err }); + } else { + // const token = jwt.sign( + // { email: user.email, id: user.id }, + // "jwtSecret", + // { + // expiresIn: "1h", + // } + // ); + res.status(201).json({ + message: "User created successfuly ! Please login in", + user: user, + }); + } + } + ); + }); + } + } + } + ); + } catch (err) { + res.json({ message: err }); + } +}; + +exports.login = async (req, res) => { + const { email, password } = req.body; + db.query("SELECT * FROM users WHERE email = ?", [email], (err, result) => { + if (err) { + res.json({ message: err }); + } else { + if (result.length > 0) { + const user = result[0]; + bcrypt.compare(password, result[0].password, (loginerr, loginres) => { + if (loginres) { + const token = jwt.sign( + { email: user.email, id: user.id }, + process.env.JWT_SECRET, + { + expiresIn: "1h", + } + ); + res.status(200).json({ loggedIn: true, user: user, token: token }); + } else { + res.json({ loggedIn: false, message: "Wrong password" }); + } + }); + } else { + res.json({ loggedIn: false, message: "No user found with this email" }); + } + } + }); +}; + +exports.forgotPassword = async (req, res, next) => { + const email = req.body.email; + try { + db.query("SELECT * FROM users WHERE email = ?", [email], (err, result) => { + if (result.length > 0) { + const resetToken = crypto.randomBytes(20).toString("hex"); + const resetPasswordToken = crypto + .createHash("sha256") + .update(resetToken) + .digest("hex"); + + // Expiration of the token in 30 minutes + const resetPasswordExpire = Date.now() + 30 * 60 * 1000; + console.log(resetPasswordExpire); + db.query( + "UPDATE users SET resetPasswordToken=?, resetPasswordExpire=? WHERE email=? ", + [resetPasswordToken, resetPasswordExpire, email], + (err, result) => { + if (result) { + // Create reset url to email to provided email + const resetUrl = `http://localhost:3000/resetpassword/${resetToken}`; + + // HTML Message + const message = ` + <h2>You have requested a password reset on PROFXXI IRIT Platform</h2> + <p>Please click on the following link in order the reset your password:</p> + <a href=${resetUrl} clicktracking=off>${resetUrl}</a> + <p>This link will expire in 30 minutes, once this duration expires you will have to proceed a new password reset request </p> + `; + + try { + sendEmail({ + to: email, + subject: "Password Reset Request - PROFXXI IRIT Platform", + text: message, + }); + res.json({ + sent: true, + message: + "an URL has been sent to your email address to reset your password", + }); + } catch (err) { + console.log(err); + next(err); + } + } else { + console.log(err); + res.json({ + sent: false, + message: "Error ! make sure you typed a valid email", + }); + } + } + ); + } else { + res.json({ + sent: false, + message: "Error ! make sure you typed a valid email", + }); + } + }); + } catch (err) { + next(err); + } +}; + +exports.resetForgotPassword = async (req, res, next) => { + const password = req.body.password; + const actualdate = Date.now(); + const resetPasswordToken = crypto + .createHash("sha256") + .update(req.params.resetToken) + .digest("hex"); + + db.query( + "SELECT * FROM users WHERE resetPasswordToken =?", + [resetPasswordToken], + (err, result) => { + if (result.length > 0) { + console.log(result[0].id); + console.log(password); + + if (actualdate < parseInt(result[0].resetPasswordExpire)) { + bcrypt.hash(password, saltRounds, (err, hash) => { + db.query( + "UPDATE users SET password = ? WHERE id = ?", + [hash, result[0].id], + (err, result) => { + console.log(result); + if (result) { + res.json({ message: "Password is successfully resetted" }); + } else { + res.json({ + message: "Error while resetting the password", + }); + } + } + ); + }); + } else { + res.json({ + message: + "Validation time has ended, please request again your password reset", + }); + } + } + } + ); +}; + +exports.update = async (req, res) => { + const email = req.body.email; + const user = req.body.user; + console.log(email); + db.query( + "UPDATE users SET email = ?, firstName = ?, lastName = ?, position= ?, organizationName= ?,profile = ?, universityWebsite = ? WHERE id = ?", + [ + user.email, + user.firstName, + user.lastName, + user.position, + user.organizationName, + user.profile, + user.universityWebsite, + req.userId, + ], + (err, result) => { + if (result) { + res.json({ + user: user, + message: "Your profile has been updated successfuly", + }); + } else { + res.json({ + message: "There has been an error while updating your profile", + }); + } + } + ); +}; + +exports.deleteProfile = async (req, res) => { + db.query( + "DELETE FROM users WHERE email=?", + [req.userEmail], + (err, result) => { + if (result) { + res.json({ message: "Your profile has been succesfully deleted" }); + } else { + res.json({ + message: "There has been an error while deleting the profile", + }); + } + } + ); +}; + +exports.deleteData = async (req, res) => { + db.query( + "DELETE u FROM units u JOIN unitgeneration g ON u.idunit = g.idunit WHERE g.email = ?", + [req.userEmail], + (err, result) => { + if (result) { + res.json({ + message: "All your data has been succesfully deleted", + }); + } else { + res.json({ + message: + "There has been an error while deleting all your data, please try later", + }); + } + } + ); +}; + +exports.resetPassword = async (req, res) => { + const password = req.body.password; + bcrypt.hash(password, saltRounds, (err, hash) => { + db.query( + "UPDATE users SET password = ? WHERE email = ?", + [hash, req.userEmail], + (err, result) => { + if (result) { + res.json({ message: "Your password has been successfully resetted" }); + } else { + res.json({ + message: "There has been an error while resetting your password", + }); + } + } + ); + }); +}; + +exports.getTotalUniversitiesNumber = async (req, res) => { + db.query( + "SELECT COUNT(DISTINCT users.organizationName) as num FROM users", + (err, result) => { + if (result) { + res.json({ totalUniversitiesNumber: result[0].num }); + } + } + ); +}; + +exports.contact = async (req, res, next) => { + const data = req.body; + console.log(data); + + const infos = `<h3> Email From The following User: </h3> + <h3>Name :${data.name} </h3> + <h3>Organization Name :${data.organization} </h3> + <h3>Email : ${data.email} </h3> + <h3> About the topic : ${data.topic} </h3> + <p> ${data.message} </p> + + `; + + try { + sendEmail({ + to: process.env.EMAIL_FROM, + subject: data.topic, + text: infos, + }); + } catch (err) { + next(err); + } +};