From cf24682456d1eb04a1c8f79f1fbe717cfbcdc861 Mon Sep 17 00:00:00 2001 From: Uttkarsh24 Date: Sun, 15 Dec 2024 10:49:08 +0530 Subject: [PATCH] Added Account recovery Route --- Backend/src/controllers/user.controller.js | 33 +++++++- Backend/src/routes/user.routes.js | 3 +- Backend/src/utils/nodemailer/email.js | 17 +++- .../nodemailer/template/usernameTemplate.js | 78 +++++++++++++++++++ 4 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 Backend/src/utils/nodemailer/template/usernameTemplate.js diff --git a/Backend/src/controllers/user.controller.js b/Backend/src/controllers/user.controller.js index 67871bd..754372c 100644 --- a/Backend/src/controllers/user.controller.js +++ b/Backend/src/controllers/user.controller.js @@ -4,7 +4,7 @@ import { User } from "../models/user.models.js"; import ApiResponse from "../utils/ApiResponse.js"; import { COOKIE_OPTIONS } from "../constants.js"; import jwt from "jsonwebtoken"; -import { sendVerificationEmail } from "../utils/nodemailer/email.js"; +import { sendVerificationEmail ,sendUsername } from "../utils/nodemailer/email.js"; const registerUser = asyncHandler( async (req,res) => { const { username, email, password } = req.body; @@ -256,10 +256,9 @@ const changeEmail = asyncHandler(async(req,res)=>{ }) const verifyNewEmail = asyncHandler (async (req,res)=>{ - //req.email pe abb naya email hai merepe already const { newEmail,code } = req.body; const user = req.user; - if (!code) { + if (!code || !newEmail) { throw new ApiError(400, "All Fields Are Required.") } if (user.verificationCode !== code) { @@ -279,6 +278,31 @@ const verifyNewEmail = asyncHandler (async (req,res)=>{ .json(new ApiResponse(200,updatedUser,"Email changed Successfully!")) }) +const forgotUsername = asyncHandler( async (req,res)=>{ + const { email }=req.body; + + if(!email){ + throw new ApiError(400,"All fields are required") + } + + const user = await User.findOne({ email: email }); + + if(!user){ + throw new ApiError(404,"Email not registered"); + } + + try { + await sendUsername(email, user.username); + + return res + .status(201) + .json(new ApiResponse(201,user,"Mail sent successfully")) + + } catch (error) { + throw new ApiError(500, error.message || "Internal Server Error."); + } +}) + export { registerUser, loginUser, @@ -288,5 +312,6 @@ export { changeUsername, addDetails, changeEmail, - verifyNewEmail + verifyNewEmail, + forgotUsername }; \ No newline at end of file diff --git a/Backend/src/routes/user.routes.js b/Backend/src/routes/user.routes.js index d7c2b72..c1b2b40 100644 --- a/Backend/src/routes/user.routes.js +++ b/Backend/src/routes/user.routes.js @@ -1,5 +1,5 @@ import { Router } from "express"; -import { registerUser, loginUser, logoutUser, verifyCode, changeUsername, changePassword ,addDetails, changeEmail, verifyNewEmail} from "../controllers/user.controller.js"; +import { registerUser, loginUser, logoutUser, verifyCode, changeUsername, changePassword ,addDetails, changeEmail, verifyNewEmail, forgotUsername} from "../controllers/user.controller.js"; import { registerUserSchema, loginUserSchema, verifyCodeSchema, changePasswordSchema, changeUsernameSchema } from "../utils/zodSchema/userValidatorSchema.js"; import validationSchema from "../middlewares/zodValidator.middleware.js"; import verifyToken from "../middlewares/auth.middleware.js"; @@ -9,6 +9,7 @@ const router = Router() router.route("/register").post(validationSchema(registerUserSchema), registerUser); router.route("/login").post(validationSchema(loginUserSchema), loginUser); router.route("/verifyCode").post(validationSchema(verifyCodeSchema) ,verifyCode); +router.route("/forgotUsername").post(forgotUsername) // secured routes router.route("/logout").post(verifyToken, logoutUser); diff --git a/Backend/src/utils/nodemailer/email.js b/Backend/src/utils/nodemailer/email.js index ff9e347..27fc23c 100644 --- a/Backend/src/utils/nodemailer/email.js +++ b/Backend/src/utils/nodemailer/email.js @@ -1,4 +1,5 @@ import { Verification_Email_Template } from "./template/emailTemplate.js"; +import {Acoount_recovery_template} from "./template/usernameTemplate.js" import transporter from "../../libs/emailConfig.js"; const sendVerificationEmail = async (email, verificationCode) => { @@ -15,4 +16,18 @@ const sendVerificationEmail = async (email, verificationCode) => { } }; -export { sendVerificationEmail }; \ No newline at end of file +const sendUsername = async (email,username)=>{ + try { + const response = await transporter.sendMail({ + from: '"Assemble" ', + to: email, + subject: "Account Recovery", + html: Acoount_recovery_template.replace("{username}", username), + }); + console.log("Email Send Successfully: ", response); + } catch (error) { + console.log(error.message); + } +} + +export { sendVerificationEmail ,sendUsername}; \ No newline at end of file diff --git a/Backend/src/utils/nodemailer/template/usernameTemplate.js b/Backend/src/utils/nodemailer/template/usernameTemplate.js new file mode 100644 index 0000000..f1100be --- /dev/null +++ b/Backend/src/utils/nodemailer/template/usernameTemplate.js @@ -0,0 +1,78 @@ +export const Acoount_recovery_template = ` + + + + + + Verify Your Email + + + +
+
Account Recovery
+
+

Hello,

+

The username for your account registered with us:

+ {username} +

If you did not send this request, no further action is required. If you have any questions, feel free to contact our support team.

+
+ +
+ + +`; \ No newline at end of file