1
+ const asyncHandler = require ( "express-async-handler" ) ;
2
+ const { validateRegisterInput } = require ( "../utils/validators" ) ;
3
+ const bcryptjs = require ( "bcryptjs" ) ;
4
+ const jwt = require ( "jsonwebtoken" ) ;
5
+ const JWT_SECRET_KEY = process . env . JWT_SECRET_KEY
6
+ const User = require ( "../models/User" ) ;
7
+
8
+ // @Desc Public
9
+ // @Route /auth/register
10
+ // @Access Public
11
+ const register = asyncHandler ( async ( req , res ) => {
12
+ const { name, email, password } = req . body ;
13
+
14
+ // Validating Data
15
+ const validate = validateRegisterInput ( email , name , password ) ;
16
+
17
+ if ( ! validate . valid ) {
18
+ res . status ( 400 )
19
+ throw new Error ( JSON . stringify ( validate . errors ) )
20
+ }
21
+
22
+ // Check if user exists
23
+ const userExists = await User . findOne ( { email } ) ;
24
+ if ( userExists ) {
25
+ res . status ( 400 )
26
+ throw new Error ( 'User Already exists' )
27
+ }
28
+
29
+ // Hash Password
30
+ const salt = await bcryptjs . genSalt ( 10 ) ;
31
+ const hashedPassword = await bcryptjs . hash ( password , salt ) ;
32
+
33
+ // Save user in database
34
+ const user = new User ( {
35
+ name,
36
+ email,
37
+ password : hashedPassword
38
+ } )
39
+
40
+ await user . save ( ) ;
41
+ res . json ( {
42
+ _id : user . _id ,
43
+ name : user . name ,
44
+ email : user . email ,
45
+ token : generateToken ( user . _id )
46
+ } ) ;
47
+ } )
48
+
49
+ // @Desc Public
50
+ // @Route /auth/login
51
+ // @Access Public
52
+ const login = asyncHandler ( async ( req , res ) => {
53
+ const { email, password } = req . body ;
54
+
55
+ // Check if user exists
56
+ const userExists = await User . findOne ( { email } ) ;
57
+ if ( ! userExists ) {
58
+ res . status ( 400 )
59
+ throw new Error ( 'No such user exists' )
60
+ }
61
+
62
+ // Verify Password
63
+ const isMatch = await bcryptjs . compare ( password , userExists . password ) ;
64
+ if ( ! isMatch ) {
65
+ res . status ( 400 )
66
+ throw new Error ( 'Incorrect Password' )
67
+ }
68
+
69
+ res . json ( {
70
+ _id : userExists . _id ,
71
+ name : userExists . name ,
72
+ email : userExists . email ,
73
+ token : generateToken ( userExists . _id )
74
+ } ) ;
75
+ } )
76
+
77
+ const generateToken = ( id ) => {
78
+ const payload = { id } ;
79
+ return jwt . sign ( payload , JWT_SECRET_KEY , { expiresIn : '365d' } )
80
+ }
81
+
82
+ module . exports = {
83
+ register,
84
+ login
85
+ }
0 commit comments