402 lines
26 KiB
JavaScript
402 lines
26 KiB
JavaScript
const bcrypt = require("bcryptjs");
|
|
const User = require("../models/User");
|
|
const Student = require("../models/Student");
|
|
const jwt = require("jsonwebtoken");
|
|
const JWT_secret = "Cantileverlabs";
|
|
const messagebird = require("messagebird")("llVKD53ve6QRpbCKOHzWBADaS", null, [
|
|
"ENABLE_CONVERSATIONSAPI_WHATSAPP_SANDBOX",
|
|
]);
|
|
const nodemailer = require("nodemailer");
|
|
const smtpTransport = require("nodemailer-smtp-transport");
|
|
|
|
// -------------------------------------------- mail transporter -----------------------------------------
|
|
|
|
var transport = nodemailer.createTransport(
|
|
smtpTransport({
|
|
host: `email-smtp.us-east-1.amazonaws.com`, //`${process.env.HOST}`
|
|
port: 465,
|
|
auth: {
|
|
user: `AKIA2G7743RRTZMVXE3X`, //`${process.env.EMAIL}`
|
|
pass: `BJSjV3jArJfsnk1LhFc/hUmisEyEtbLNGgrRbv0noh8c`, //`${process.env.PASS}`
|
|
},
|
|
})
|
|
);
|
|
|
|
// -------------------------------------------- mail transporter -----------------------------------------
|
|
|
|
module.exports.Protected = async (req, res, next) => {
|
|
res.send("Hello User");
|
|
};
|
|
module.exports.postSignup = async (req, res, next) => {
|
|
try {
|
|
//we need firstName , lastName , email , password as input
|
|
let firstName = req.body.firstName || " ";
|
|
let lastName = req.body.lastName || " ";
|
|
const { sending_company_email, email, password, subject } = req.body;
|
|
let user = await User.findOne({ email: email });
|
|
if (user) {
|
|
res.json({
|
|
message: "User already exist",
|
|
type: "error",
|
|
});
|
|
} else {
|
|
const email_otp = Math.floor(100000 + Math.random() * 900000);
|
|
console.log("otp", email_otp);
|
|
const hashedPass = await bcrypt.hash(password, 12);
|
|
user = new User({
|
|
firstName: firstName,
|
|
lastName: lastName,
|
|
email: email,
|
|
password: hashedPass,
|
|
isAdmin: false,
|
|
// email_otp,
|
|
});
|
|
user = await user.save();
|
|
await Student.deleteOne({ user: user._id });
|
|
let student = new Student({
|
|
user: user._id,
|
|
});
|
|
student = await student.save();
|
|
user.student = student._id;
|
|
await user.save();
|
|
// const message = {
|
|
// from: `${sending_company_email}`, // Sender address
|
|
// to: `${email}`, // List of recipients
|
|
// subject: `${subject}`, // Subject line
|
|
// html: '', // design html for email message.
|
|
// };
|
|
// transport.sendMail(message, function (err, info) {
|
|
// if (err) {
|
|
// console.log(err);
|
|
// } else {
|
|
// console.log(info);
|
|
// }
|
|
// });
|
|
res.json({
|
|
message: "You Are Registered, Please Login",
|
|
type: "success",
|
|
});
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
};
|
|
|
|
module.exports.verfiyemail = async (req, res, next) => {
|
|
const { email, otp } = req.body;
|
|
try {
|
|
let user = await User.findOne({ email: email });
|
|
if (user) {
|
|
const isMatched = await (user.email_otp == otp ? true : false);
|
|
if (isMatched) {
|
|
if (!user.isVerified) {
|
|
user.isVerified = true;
|
|
await user.save();
|
|
res.json({
|
|
message: "User Verified, Please Login",
|
|
});
|
|
} else {
|
|
res.json({
|
|
message: "User Already Verified, Please Login",
|
|
});
|
|
}
|
|
} else {
|
|
res.json({
|
|
message: "OTP Doesn't Matched!",
|
|
type: "error",
|
|
});
|
|
}
|
|
} else {
|
|
res.json({
|
|
message: "No user with this email exists",
|
|
type: "error",
|
|
});
|
|
}
|
|
} catch {
|
|
(err) => {
|
|
console.log(err);
|
|
};
|
|
}
|
|
};
|
|
|
|
module.exports.postSignin = async (req, res, next) => {
|
|
try {
|
|
//we need email and password as input
|
|
let email = req.body.email;
|
|
let password = req.body.password;
|
|
let user = await User.findOne({ email: email });
|
|
if (user) {
|
|
const isMatched = await bcrypt.compare(password, user.password);
|
|
if (isMatched) {
|
|
const token = jwt.sign({ _id: user._id }, JWT_secret);
|
|
res.json({
|
|
token: token,
|
|
});
|
|
} else {
|
|
res.json({
|
|
message: "email and password doesn't match",
|
|
type: "error",
|
|
});
|
|
}
|
|
} else {
|
|
res.json({
|
|
message: "No user with this email exists",
|
|
type: "error",
|
|
});
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
};
|
|
|
|
// Phone verification Starts.
|
|
// -----------------------------------------------------------------------------------------------
|
|
|
|
module.exports.sendOTP = (req, res, next) => {
|
|
//uNNYosMopvvCW9RTR1tRWJmYC test
|
|
//llVKD53ve6QRpbCKOHzWBADaS live
|
|
const { phoneNumber } = req.body;
|
|
try {
|
|
if (!phoneNumber) {
|
|
res.status(422).json({ message: "Please Add All Required Fields" });
|
|
return;
|
|
} else {
|
|
messagebird.verify.create(
|
|
phoneNumber,
|
|
{
|
|
template: "Your verification code is %token",
|
|
},
|
|
function (err, response) {
|
|
if (err) {
|
|
console.log(err);
|
|
res.status(422).json({ message: err.errors[0].description });
|
|
} else {
|
|
console.log(response);
|
|
res.json({ id: response.id });
|
|
}
|
|
}
|
|
);
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
};
|
|
|
|
module.exports.getOTP = (req, res, next) => {
|
|
try {
|
|
const { id, otp } = req.body;
|
|
messagebird.verify.verify(id, otp, function (err, response) {
|
|
if (err) {
|
|
console.log({ error: err.errors[0].description, id: id });
|
|
res.json({ error: err.errors[0].description, id: id });
|
|
} else {
|
|
console.log(response);
|
|
res.json({ message: "Code Verified" });
|
|
}
|
|
});
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
};
|
|
// Phone verification End.
|
|
// -----------------------------------------------------------------------------------------------
|
|
|
|
// -----------------------------------------------------------------------------------------------
|
|
// Forgot password Starts
|
|
|
|
module.exports.forgotpassword = async (req, res, next) => {
|
|
const { email, link, sending_company_email, subject } = req.body;
|
|
//link = https://cantileverlabs.herokuapp.com/resetpassword/:id/:token
|
|
try {
|
|
await User.findOne({ email }).then((user) => {
|
|
if (!user) {
|
|
res.status(404).json({ error: "User not found with this Email" });
|
|
return;
|
|
} else {
|
|
const payload = {
|
|
email: user.email,
|
|
_id: user._id,
|
|
};
|
|
const secret = JWT_secret + user.password;
|
|
const token = jwt.sign(payload, secret, { expiresIn: "10m" });
|
|
User.findByIdAndUpdate(user._id, {
|
|
$set: { passwordResetToken: token },
|
|
})
|
|
.then((data) => {
|
|
const reset_link = `${link}/${user._id}/${token}`;
|
|
const message = {
|
|
from: `${sending_company_email}`, // Sender address
|
|
to: `${user.email}`, // List of recipients
|
|
subject: `${subject}`, // Subject line
|
|
html: `
|
|
<!doctype html>
|
|
<html lang="en-US">
|
|
|
|
<head>
|
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
|
<title>Reset Password Email Template</title>
|
|
<meta name="description" content="Reset Password Email Template.">
|
|
<style type="text/css">
|
|
a:hover {text-decoration: underline !important;}
|
|
</style>
|
|
</head>
|
|
|
|
<body marginheight="0" topmargin="0" marginwidth="0" style="margin: 0px; background-color: #f2f3f8;" leftmargin="0">
|
|
<!--100% body table-->
|
|
<table cellspacing="0" border="0" cellpadding="0" width="100%" bgcolor="#f2f3f8"
|
|
style="@import url(https://fonts.googleapis.com/css?family=Rubik:300,400,500,700|Open+Sans:300,400,600,700); font-family: 'Open Sans', sans-serif;">
|
|
<tr>
|
|
<td>
|
|
<table style="background-color: #f2f3f8; max-width:670px; margin:0 auto;" width="100%" border="0"
|
|
align="center" cellpadding="0" cellspacing="0">
|
|
<tr>
|
|
<td style="height:80px;"> </td>
|
|
</tr>
|
|
<tr>
|
|
<td style="text-align:center;">
|
|
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="height:20px;"> </td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<table width="95%" border="0" align="center" cellpadding="0" cellspacing="0"
|
|
style="max-width:670px;background:#fff; border-radius:3px; text-align:center;-webkit-box-shadow:0 6px 18px 0 rgba(0,0,0,.06);-moz-box-shadow:0 6px 18px 0 rgba(0,0,0,.06);box-shadow:0 6px 18px 0 rgba(0,0,0,.06);">
|
|
<tr>
|
|
<td style="height:40px;"> </td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:0 35px;">
|
|
<a href="https://cantileverlabs.com" title="logo" target="_blank">
|
|
<img width="80" height="80"
|
|
src="https://media-exp1.licdn.com/dms/image/C510BAQEgcV3sgE1PIA/company-logo_200_200/0/1552289011007?e=2159024400&v=beta&t=FO8loLVwC5qoHmYkk-gR-mv7vC36LPG17yZkxOFl6Go" style="margin:40px" title="logo" alt="logo">
|
|
</a> <h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">You have
|
|
requested to reset your password</h1>
|
|
<span
|
|
style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;"></span>
|
|
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
|
|
We cannot simply send you your old password. A unique link to reset your
|
|
password has been generated for you. To reset your password, click the
|
|
following link and follow the instructions.
|
|
</p>
|
|
<a href=${reset_link}
|
|
style="background:#ffc600;text-decoration:none !important; font-weight:500; margin-top:35px; color:#111;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;">Reset
|
|
Password</a>
|
|
|
|
<p style="color:#455056; margin:"30px";font-size:15px;line-height:24px; margin:0;">
|
|
Facing any issue? Write us at
|
|
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;"><a href="mailto:info@cantileverlabs.com">info@cantileverlabs.com</a></P>
|
|
<img width="300" height="80"
|
|
src="data:image/png;base64,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"
|
|
title="logo" alt="logo">
|
|
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
|
|
<a href="https://www.cantileverlabs.com/policies#privacy" style="text-decoration:none;border-right:1px solid;padding-right:10px">Privacy Policy</a>
|
|
<a href="https://www.cantileverlabs.com/policies#privacy" style="text-decoration:none ; border-right:1px solid;padding-right:10px;margin-left:5px">Terms Of Use</a>
|
|
<a href="mailto:infi@cantileverlabs.com" style="text-decoration:none ;margin-left:5px">Contact Us</a>
|
|
</p>
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="height:40px;"> </td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<tr>
|
|
<td style="height:20px;"> </td>
|
|
</tr>
|
|
<tr>
|
|
<td style="text-align:center;">
|
|
<div class="reset-logo2-J ">
|
|
<img src="./images/Icon material-copyright.png" alt="">
|
|
<span class="light-copyright-J">copyright <span class="bold-copyright-J">2018 Cantilever Labs</span></span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="height:80px;"> </td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<!--/100% body table-->
|
|
</body>
|
|
|
|
</html>
|
|
`, // design html for email message.
|
|
};
|
|
transport.sendMail(message, function (err, info) {
|
|
if (err) {
|
|
console.log(err);
|
|
} else {
|
|
console.log(info);
|
|
}
|
|
});
|
|
res.status(200).json({
|
|
message: "Link is Active for 10 mins",
|
|
reset_link,
|
|
});
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
}
|
|
});
|
|
} catch {
|
|
(error) => {
|
|
console.log("Error from forgot pass", error);
|
|
};
|
|
}
|
|
};
|
|
module.exports.resetpassword = async (req, res, next) => {
|
|
const { _id, token } = req.params;
|
|
const { password } = req.body;
|
|
try {
|
|
let user = await User.findById({ _id });
|
|
if (!user) {
|
|
res.json({ error: "User not Found or WrongId" });
|
|
return;
|
|
} else {
|
|
const secret = JWT_secret + user.password;
|
|
const user_token = user.passwordResetToken;
|
|
const payload = jwt.verify(token, secret);
|
|
const hashedPass = await bcrypt.hash(password, 12);
|
|
if (token == user_token) {
|
|
user.password = hashedPass;
|
|
await user
|
|
.save()
|
|
.then((ok) => {
|
|
res.header("Access-Control-Allow-Origin", "*");
|
|
res.header("Access-Control-Allow-Headers", "*");
|
|
res.json({ message: "Password Updated!" });
|
|
})
|
|
.catch((err) => {
|
|
console.log("Error in save", err);
|
|
});
|
|
} else {
|
|
res.status(422).json({ error: "Either Token not found or Expired!" });
|
|
return;
|
|
}
|
|
}
|
|
} catch {
|
|
(err) => {
|
|
console.log("error from try catch resetpass", err);
|
|
};
|
|
}
|
|
};
|
|
|
|
// Forgot password Ends
|
|
// -----------------------------------------------------------------------------------------------
|
|
|
|
module.exports.checkProtected = (req, res, next) => {
|
|
console.log(req.user);
|
|
res.json({
|
|
message: "Protected",
|
|
user: req.user,
|
|
});
|
|
};
|