@@ -4,6 +4,24 @@ import { ApiResponse } from "../utils/ApiResponse.js";
44import { User } from "../models/user.models.js" ;
55import { uploadOnCloudinary } from "../utils/cloudinary.js" ;
66
7+ const generateAccessAndRefreshTokens = async ( userId ) => {
8+ try {
9+ const user = await User . findById ( userId ) ;
10+ const accessToken = user . generateAccessToken ( ) ;
11+ const refreshToken = user . generateRefreshToken ( ) ;
12+
13+ user . refreshToken = refreshToken ;
14+ await user . save ( { validateBeforeSave : false } ) ;
15+
16+ return { accessToken, refreshToken } ;
17+ } catch ( error ) {
18+ throw new ApiError (
19+ 500 ,
20+ "Something went wrong while generating refresh and access token"
21+ ) ;
22+ }
23+ } ;
24+
725const registerUser = asyncHandler ( async ( req , res ) => {
826 // get user details from frontend
927 //validation - not empty
@@ -74,4 +92,83 @@ const registerUser = asyncHandler(async (req, res) => {
7492 . json ( new ApiResponse ( 200 , createdUser , "User Created Successfully" ) ) ;
7593} ) ;
7694
77- export { registerUser } ;
95+ const loginUser = asyncHandler ( async ( req , res ) => {
96+ // req body -> data
97+ // username or email
98+ // find the user
99+ // password check
100+ // access and refresh token
101+ //send cookie
102+
103+ const { email, username, password } = req . body ;
104+
105+ if ( ! username || ! email ) {
106+ throw new ApiError ( 400 , "username or password is required" ) ;
107+ }
108+
109+ const user = await User . findOne ( {
110+ $or : [ { username } , { email } ] ,
111+ } ) ;
112+
113+ if ( ! user ) {
114+ throw new ApiError ( 404 , "User does not exist" ) ;
115+ }
116+
117+ const isPasswordValid = await user . isPasswordCorrect ( password ) ;
118+
119+ if ( ! isPasswordValid ) {
120+ throw new ApiError ( 401 , "Invalid user credentials" ) ;
121+ }
122+ const { accessToken, refreshToken } = await generateAccessAndRefreshTokens (
123+ user . _id
124+ ) ;
125+
126+ const loggedInUser = await User . findById ( user . _id ) . select (
127+ "-password -refreshToken"
128+ ) ;
129+ const options = {
130+ httpOnly : true ,
131+ secure : true ,
132+ } ;
133+ return res
134+ . status ( 200 )
135+ . cookie ( "accessToken" , accessToken , options )
136+ . cookie ( "refreshToken" , refreshToken , options )
137+ . json (
138+ // to store in local storage (not a good practice though we also send access and refresh token in json response, )
139+ // in mobile cookies are not set
140+ new ApiResponse (
141+ 200 ,
142+ {
143+ user : loggedInUser ,
144+ accessToken,
145+ refreshToken,
146+ } ,
147+ "User logged In Successfully"
148+ )
149+ ) ;
150+ } ) ;
151+
152+ const logoutUser = asyncHandler ( async ( req , res ) => {
153+ await User . findByIdAndUpdate (
154+ req . user . _id ,
155+ {
156+ $set : {
157+ refreshToken : undefined ,
158+ } ,
159+ } ,
160+ {
161+ new : true ,
162+ }
163+ ) ;
164+ const options = {
165+ httpOnly : true ,
166+ secure : true ,
167+ } ;
168+ return res
169+ . status ( 200 )
170+ . clearCookie ( "accessToken" , options )
171+ . clearCookie ( "refreshToken" , options )
172+ . json ( new ApiResponse ( 200 , { } , "User logged out" ) ) ;
173+ } ) ;
174+ export { registerUser , loginUser , logoutUser } ;
0 commit comments