@@ -3,50 +3,69 @@ import jwt from 'jsonwebtoken';
33
44import User from '../../models/user.model.js' ;
55import Subscriber from '../../models/subscriber.model.js' ;
6-
76import { sendResponse } from '../../utils/response.js' ;
7+ import { CookieToken , NodeEnv } from '../../typings/index.js' ;
88import {
99 JWT_SECRET_ACCESS_KEY ,
10- JWT_EXPIRES_IN ,
10+ JWT_SECRET_REFRESH_KEY ,
11+ JWT_ACCESS_EXPIRES_IN ,
12+ JWT_REFRESH_EXPIRES_IN ,
13+ JWT_ACCESS_EXPIRES_IN_NUM ,
14+ JWT_REFRESH_EXPIRES_IN_NUM ,
1115 NODE_ENV ,
1216} from '../../config/env.js' ;
13- import { NodeEnv } from '../../typings/index.js' ;
17+
18+ // Helper function to generate both tokens
19+ const generateTokens = payload => {
20+ const accessToken = jwt . sign ( payload , JWT_SECRET_ACCESS_KEY , {
21+ expiresIn : JWT_ACCESS_EXPIRES_IN || '15m' ,
22+ } ) ;
23+ const refreshToken = jwt . sign ( payload , JWT_SECRET_REFRESH_KEY , {
24+ expiresIn : JWT_REFRESH_EXPIRES_IN || '7d' ,
25+ } ) ;
26+ return { accessToken, refreshToken } ;
27+ } ;
1428
1529const login = async ( req , res ) => {
1630 const { email, password } = req . body ;
1731
1832 try {
33+ // Check subscriber existence
1934 const isSubscriber = await Subscriber . exists ( { email } ) ;
2035 if ( ! isSubscriber ) {
21- return sendResponse ( res , 404 , 'error' , 'Email not found' , null ) ;
36+ return sendResponse ( res , 404 , 'error' , 'Email not found' ) ;
2237 }
2338
2439 const user = await User . findOne ( {
25- 'personal_info.email' : isSubscriber ? ._id ,
40+ 'personal_info.email' : isSubscriber . _id ,
2641 } ) ;
2742 if ( ! user ) {
28- return sendResponse ( res , 404 , 'error' , 'User not found' , null ) ;
43+ return sendResponse ( res , 404 , 'error' , 'User not found' ) ;
2944 }
3045
31- if ( ! user . personal_info || ! user . personal_info . password ) {
32- return sendResponse ( res , 500 , 'error' , 'User data is incomplete' , null ) ;
46+ if ( ! user . personal_info ? .password ) {
47+ return sendResponse ( res , 500 , 'error' , 'User data is incomplete' ) ;
3348 }
3449
3550 const isMatch = await bcrypt . compare ( password , user . personal_info . password ) ;
36- if ( ! isMatch )
37- return sendResponse ( res , 401 , 'error' , 'Incorrect password' , null ) ;
51+ if ( ! isMatch ) return sendResponse ( res , 401 , 'error' , 'Incorrect password' ) ;
3852
39- const payload = { userId : user . _id , email : user ?. personal_info ?. email } ;
40- const secret = JWT_SECRET_ACCESS_KEY ;
41- const options = { expiresIn : JWT_EXPIRES_IN } ;
53+ const payload = { userId : user . _id , email : user . personal_info . email } ;
54+ const { accessToken, refreshToken } = generateTokens ( payload ) ;
4255
43- const token = jwt . sign ( payload , secret , options ) ;
56+ // Set secure cookies
57+ res . cookie ( CookieToken . ACCESS_TOKEN , accessToken , {
58+ httpOnly : true ,
59+ secure : NODE_ENV === NodeEnv . PRODUCTION ,
60+ sameSite : 'strict' ,
61+ maxAge : JWT_ACCESS_EXPIRES_IN_NUM ,
62+ } ) ;
4463
45- res . cookie ( 'token' , token , {
64+ res . cookie ( CookieToken . REFRESH_TOKEN , refreshToken , {
4665 httpOnly : true ,
4766 secure : NODE_ENV === NodeEnv . PRODUCTION ,
4867 sameSite : 'strict' ,
49- maxAge : 7 * 24 * 60 * 60 * 1000 , // 7 days
68+ maxAge : JWT_REFRESH_EXPIRES_IN_NUM ,
5069 } ) ;
5170
5271 return sendResponse ( res , 200 , 'success' , 'Login successful' , user ) ;
@@ -55,8 +74,7 @@ const login = async (req, res) => {
5574 res ,
5675 500 ,
5776 'error' ,
58- err . message || 'Internal Server Error' ,
59- null
77+ err . message || 'Internal Server Error'
6078 ) ;
6179 }
6280} ;
0 commit comments