@@ -39,9 +39,10 @@ exports.login = async (req, res) => {
3939 return res . status ( 401 ) . json ( { success : false , message : "Invalid email or password" } ) ;
4040 }
4141
42+ const jwtSecret = process . env . JWT_SECRET || 'mailmern-secret' ;
4243 const token = jwt . sign (
4344 { id : user . _id , email : user . email } ,
44- process . env . JWT_SECRET ,
45+ jwtSecret ,
4546 { expiresIn : "1d" }
4647 ) ;
4748
@@ -55,66 +56,88 @@ exports.login = async (req, res) => {
5556 res . status ( 400 ) . json ( { success : false , error : err . message } ) ;
5657 }
5758} ;
58- exports . sendOtp = async ( req , res ) => {
59+ exports . sendOtp = async ( req , res ) => {
5960 try {
60- const { email} = req . body ;
61- const user = await User . findOne ( { email} ) ;
62- if ( ! user ) return res . status ( 400 ) . json ( { message :"User does not exist." } ) ;
61+ const { email } = req . body ;
62+ if ( ! email ) {
63+ return res . status ( 400 ) . json ( { success : false , message : "Email is required" } ) ;
64+ }
65+ const user = await User . findOne ( { email } ) ;
66+ if ( ! user ) {
67+ return res . status ( 400 ) . json ( { success : false , message : "User does not exist." } ) ;
68+ }
6369
6470 const otp = Math . floor ( 1000 + Math . random ( ) * 9000 ) . toString ( ) ; // 4-digit OTP
6571 user . resetOtp = otp ;
66- user . otpExpires = Date . now ( ) + 5 * 60 * 1000 ; // 5 minutes
72+ user . otpExpires = Date . now ( ) + 5 * 60 * 1000 ;
6773 user . isOtpVerified = false ;
6874 await user . save ( ) ;
6975
70- await sendEmail
71-
72-
76+ await sendEmail ( { to : email , otp } ) ;
7377
74-
75- ( { to : email , otp } ) ; // ✅ Correct usage
76- return res . status ( 200 ) . json ( { message :"OTP sent successfully" } ) ;
78+ return res . status ( 200 ) . json ( { success : true , message : "OTP sent successfully" } ) ;
7779 } catch ( error ) {
78- return res . status ( 500 ) . json ( { message : `send otp error ${ error } ` } ) ;
79- }
80+ console . error ( "Send OTP error:" , error ) ;
81+ return res . status ( 500 ) . json ( { success : false , message : `Failed to send OTP: ${ error . message } ` } ) ;
82+ }
8083} ;
8184
82-
83- exports . verifyOtp = async ( req , res ) => {
85+ exports . verifyOtp = async ( req , res ) => {
8486 try {
85- const { email, otp} = req . body ;
86- const user = await User . findOne ( { email} ) ;
87- if ( ! user || user . resetOtp !== otp || user . otpExpires < Date . now ( ) ) {
88- return res . status ( 400 ) . json ( { message :"Invalid/expired OTP" } ) ;
87+ const { email, otp } = req . body ;
88+ if ( ! email || ! otp ) {
89+ return res . status ( 400 ) . json ( { success : false , message : "Email and OTP are required" } ) ;
90+ }
91+ const user = await User . findOne ( { email } ) ;
92+ if ( ! user ) {
93+ return res . status ( 400 ) . json ( { success : false , message : "User does not exist" } ) ;
94+ }
95+ if ( ! user . resetOtp || user . resetOtp !== otp ) {
96+ return res . status ( 400 ) . json ( { success : false , message : "Invalid OTP" } ) ;
97+ }
98+ if ( user . otpExpires < Date . now ( ) ) {
99+ return res . status ( 400 ) . json ( { success : false , message : "OTP has expired" } ) ;
89100 }
90101
91102 user . isOtpVerified = true ;
92103 user . resetOtp = undefined ;
93104 user . otpExpires = undefined ;
94105 await user . save ( ) ;
95106
96- return res . status ( 200 ) . json ( { message :"OTP verified successfully" } ) ;
107+ return res . status ( 200 ) . json ( { success : true , message : "OTP verified successfully" } ) ;
97108 } catch ( error ) {
98- return res . status ( 500 ) . json ( { message : `verify otp error ${ error } ` } ) ;
109+ console . error ( "Verify OTP error:" , error ) ;
110+ return res . status ( 500 ) . json ( { success : false , message : `Failed to verify OTP: ${ error . message } ` } ) ;
99111 }
100112} ;
101113
102- exports . resetPassword = async ( req , res ) => {
114+ exports . resetPassword = async ( req , res ) => {
103115 try {
104- const { email, newPassword} = req . body ;
105- const user = await User . findOne ( { email} ) ;
106- if ( ! user || ! user . isOtpVerified ) {
107- return res . status ( 400 ) . json ( { message :"OTP verification required" } ) ;
116+ const { email, newPassword } = req . body ;
117+ if ( ! email || ! newPassword ) {
118+ return res . status ( 400 ) . json ( { success : false , message : "Email and new password are required" } ) ;
119+ }
120+ if ( newPassword . length < 6 ) {
121+ return res . status ( 400 ) . json ( { success : false , message : "Password must be at least 6 characters" } ) ;
122+ }
123+ const user = await User . findOne ( { email } ) ;
124+ if ( ! user ) {
125+ return res . status ( 400 ) . json ( { success : false , message : "User does not exist" } ) ;
126+ }
127+ if ( ! user . isOtpVerified ) {
128+ return res . status ( 400 ) . json ( { success : false , message : "OTP verification required. Please verify OTP first." } ) ;
108129 }
109130
110131 const hashedPassword = await bcrypt . hash ( newPassword , 10 ) ;
111132 user . password = hashedPassword ;
112133 user . isOtpVerified = false ; // reset verification
134+ user . resetOtp = undefined ;
135+ user . otpExpires = undefined ;
113136 await user . save ( ) ;
114137
115- return res . status ( 200 ) . json ( { message :"Password reset successfully" } ) ;
138+ return res . status ( 200 ) . json ( { success : true , message : "Password reset successfully" } ) ;
116139 } catch ( error ) {
117- return res . status ( 500 ) . json ( { message : `reset password error ${ error } ` } ) ;
140+ console . error ( "Reset password error:" , error ) ;
141+ return res . status ( 500 ) . json ( { success : false , message : `Failed to reset password: ${ error . message } ` } ) ;
118142 }
119- } ;
120-
143+ } ;
0 commit comments