@@ -124,86 +124,93 @@ export const refreshToken = async (req, res) => {
124124 }
125125} ;
126126
127- export const login = ( req , res , next ) => {
128- passport . authenticate ( 'local' , { session : false } , async ( err , user , info ) => {
129- if ( err ) {
130- return res . status ( 500 ) . json ( { message : info ?. message || "Server side error" } ) ;
131- }
132- if ( ! user && info ?. message === "Invalid credentials" ) {
133- return res . status ( 401 ) . json ( { message : info ?. message } ) ;
134- }
135- else if ( ! user ) {
136- return res . status ( 404 ) . json ( { message : info ?. message || "User not found" } ) ;
127+ export const login = ( req , res , next ) => {
128+ passport . authenticate ( 'local' , { session : false } , async ( err , user , info ) => {
129+ try {
130+ if ( err ) {
131+ console . error ( 'Passport local error:' , err ) ;
132+ return res . status ( 500 ) . json ( { message : 'Authentication error' } ) ;
133+ }
134+
135+ if ( ! user && info ?. message === 'Invalid credentials' ) {
136+ return res . status ( 401 ) . json ( { message : info ?. message } ) ;
137+ } else if ( ! user ) {
138+ return res . status ( 404 ) . json ( { message : info ?. message || 'User not found' } ) ;
139+ }
140+
141+ // fetch fresh user doc to get latest tokenVersion / public fields
142+ const userDetails = await User . findById ( user . _id ) ;
143+ if ( ! userDetails ) {
144+ return res . status ( 404 ) . json ( { message : 'User not found' } ) ;
145+ }
146+
147+ const token = generateToken ( userDetails ) ;
148+
149+ // prefer model helper toPublic if available, otherwise expose safe fields
150+ const publicUser = typeof userDetails . toPublic === 'function'
151+ ? userDetails . toPublic ( false )
152+ : {
153+ email : userDetails . email ,
154+ firstName : userDetails . firstName ,
155+ lastName : userDetails . lastName ,
156+ } ;
157+
158+ return res . status ( 200 ) . json ( {
159+ message : info ?. message || 'Login successful' ,
160+ user : publicUser ,
161+ token
162+ } ) ;
163+ } catch ( e ) {
164+ console . error ( 'Login handler error:' , e ) ;
165+ return res . status ( 500 ) . json ( { message : 'Server error during login' } ) ;
137166 }
167+ } ) ( req , res , next ) ;
168+ } ;
138169
139- const userDetails = await User . findById ( user . _id ) ;
140- const { email, firstName, lastName} = userDetails ;
141- const token = generateToken ( userDetails ) ;
142-
143- return res . status ( 200 ) . json ( {
144- message :info ?. message ,
145- userDetails : {
146- email,
147- firstName,
148- lastName
149- } ,
150- token : token
151- } ) ;
152- } ) ( req , res , next ) ;
153- }
154-
155- export const signUp = async ( req , res , next ) => {
156- const { email, name, firstName, lastName, password, authProvider} = req . body ;
157- if ( ! email || ! name || ! firstName || ! lastName || ! password ) {
158- res . statusCode = 400 ;
159- next ( new Error ( "Required Details are missing" ) ) ;
170+ export const signUp = async ( req , res , next ) => {
171+ const { email, name, firstName, lastName, password, authProvider } = req . body ;
172+ if ( ! email || ! name || ! firstName || ! lastName || ! password ) {
173+ return next ( new Error ( 'Required details are missing' ) ) ;
160174 }
161175
162- try {
163-
176+ try {
164177 const user = await User . findOne ( {
165- $or : [ { email} , { name} ]
178+ $or : [ { email } , { name } ]
166179 } ) ;
167180
168- if ( user ) {
169- res . statusCode = 400 ;
170- throw new Error ( "User with email or name already exists" ) ;
181+ if ( user ) {
182+ return res . status ( 400 ) . json ( { message : 'User with email or name already exists' } ) ;
171183 }
172-
173- // Whitelist only allowed fields to prevent mass assignment
184+
174185 const allowedFields = {
175186 email,
176187 name,
177188 firstName,
178189 lastName,
179190 password,
180- authProvider : authProvider || 'local' // default to 'local' if not provided
191+ authProvider : authProvider || 'local'
181192 } ;
182-
183- await User . create ( allowedFields ) ;
184- res . status ( 201 ) . json ( {
185- message : "User signed up successfully" ,
186- userDetail : {
187- userName : name ,
188- email : email ,
189- firstName : firstName ,
190- lastName : lastName
191- }
192- } ) ;
193193
194- } catch ( err ) {
194+ const created = await User . create ( allowedFields ) ;
195195
196- if ( err . name === "ValidationError" ) {
196+ const publicUser = typeof created . toPublic === 'function'
197+ ? created . toPublic ( false )
198+ : { email : created . email , firstName : created . firstName , lastName : created . lastName } ;
199+
200+ return res . status ( 201 ) . json ( {
201+ message : 'User signed up successfully' ,
202+ user : publicUser
203+ } ) ;
204+ } catch ( err ) {
205+ console . error ( 'Signup error:' , err ) ;
206+ if ( err . name === 'ValidationError' ) {
197207 const errors = Object . values ( err . errors ) . map ( e => e . message ) ;
198208 return res . status ( 400 ) . json ( {
199209 name : err . name ,
200- message : " Validation Failed" ,
210+ message : ' Validation Failed' ,
201211 errors
202212 } ) ;
203213 }
204-
205- res . status ( 500 ) . json ( {
206- error : err . message ,
207- message : "Internal server error during signup" } ) ;
214+ return res . status ( 500 ) . json ( { message : 'Internal server error during signup' } ) ;
208215 }
209- }
216+ } ;
0 commit comments