1
+ const mysql = require ( "mysql" ) ;
2
+ const jwt = require ( 'jsonwebtoken' ) ;
3
+ const bcrypt = require ( 'bcryptjs' ) ;
4
+ const { promisify } = require ( 'util' ) ;
5
+
6
+ const db = mysql . createConnection ( {
7
+ host : process . env . DATABASE_HOST ,
8
+ user : process . env . DATABASE_USER ,
9
+ password : process . env . DATABASE_PASSWORD ,
10
+ database : process . env . DATABASE
11
+ } ) ;
12
+
13
+ exports . login = async ( req , res ) => {
14
+ try {
15
+ const { email, password } = req . body ;
16
+
17
+ if ( ! email || ! password ) {
18
+ return res . status ( 400 ) . render ( 'login' , {
19
+ message : 'Please provide an email and password'
20
+ } )
21
+ }
22
+
23
+ db . query ( 'SELECT * FROM users WHERE email = ?' , [ email ] , async ( error , results ) => {
24
+ console . log ( results ) ;
25
+ if ( ! results || ! ( await bcrypt . compare ( password , results [ 0 ] . password ) ) ) {
26
+ res . status ( 401 ) . render ( 'login' , {
27
+ message : 'Email or Password is incorrect'
28
+ } )
29
+ } else {
30
+ const id = results [ 0 ] . id ;
31
+
32
+ const token = jwt . sign ( { id } , process . env . JWT_SECRET , {
33
+ expiresIn : process . env . JWT_EXPIRES_IN
34
+ } ) ;
35
+
36
+ console . log ( "The token is: " + token ) ;
37
+
38
+ const cookieOptions = {
39
+ expires : new Date (
40
+ Date . now ( ) + process . env . JWT_COOKIE_EXPIRES * 24 * 60 * 60 * 1000
41
+ ) ,
42
+ httpOnly : true
43
+ }
44
+
45
+ res . cookie ( 'jwt' , token , cookieOptions ) ;
46
+ res . status ( 200 ) . redirect ( "/" ) ;
47
+ }
48
+
49
+ } )
50
+
51
+ } catch ( error ) {
52
+ console . log ( error ) ;
53
+ }
54
+ }
55
+
56
+ exports . register = ( req , res ) => {
57
+ console . log ( req . body ) ;
58
+
59
+ const { name, email, password, passwordConfirm } = req . body ;
60
+
61
+ db . query ( 'SELECT email FROM users WHERE email = ?' , [ email ] , async ( error , results ) => {
62
+ if ( error ) {
63
+ console . log ( error ) ;
64
+ }
65
+
66
+ if ( results . length > 0 ) {
67
+ return res . render ( 'register' , {
68
+ message : 'That email is already in use'
69
+ } )
70
+ } else if ( password !== passwordConfirm ) {
71
+ return res . render ( 'register' , {
72
+ message : 'Passwords do not match'
73
+ } ) ;
74
+ }
75
+
76
+ let hashedPassword = await bcrypt . hash ( password , 8 ) ;
77
+ console . log ( hashedPassword ) ;
78
+
79
+ db . query ( 'INSERT INTO users SET ?' , { name : name , email : email , password : hashedPassword } , ( error , results ) => {
80
+ if ( error ) {
81
+ console . log ( error ) ;
82
+ } else {
83
+ console . log ( results ) ;
84
+ return res . render ( 'register' , {
85
+ message : 'User registered'
86
+ } ) ;
87
+ }
88
+ } )
89
+
90
+
91
+ } ) ;
92
+
93
+ }
94
+
95
+ exports . isLoggedIn = async ( req , res , next ) => {
96
+ // console.log(req.cookies);
97
+ if ( req . cookies . jwt ) {
98
+ try {
99
+ //1) verify the token
100
+ const decoded = await promisify ( jwt . verify ) ( req . cookies . jwt ,
101
+ process . env . JWT_SECRET
102
+ ) ;
103
+
104
+ console . log ( decoded ) ;
105
+
106
+ //2) Check if the user still exists
107
+ db . query ( 'SELECT * FROM users WHERE id = ?' , [ decoded . id ] , ( error , result ) => {
108
+ console . log ( result ) ;
109
+
110
+ if ( ! result ) {
111
+ return next ( ) ;
112
+ }
113
+
114
+ req . user = result [ 0 ] ;
115
+ console . log ( "user is" )
116
+ console . log ( req . user ) ;
117
+ return next ( ) ;
118
+
119
+ } ) ;
120
+ } catch ( error ) {
121
+ console . log ( error ) ;
122
+ return next ( ) ;
123
+ }
124
+ } else {
125
+ next ( ) ;
126
+ }
127
+ }
128
+
129
+ exports . logout = async ( req , res ) => {
130
+ res . cookie ( 'jwt' , 'logout' , {
131
+ expires : new Date ( Date . now ( ) + 2 * 1000 ) ,
132
+ httpOnly : true
133
+ } ) ;
134
+
135
+ res . status ( 200 ) . redirect ( '/' ) ;
136
+ }
0 commit comments