1
+ import jwt from "jsonwebtoken" ;
2
+ import redisClient from '../server.js' ;
3
+
4
+ const handleSignIn = ( db , bcrypt , req , res ) => {
5
+ const { email, password} = req . body ;
6
+ if ( ! email || ! password ) {
7
+ return Promise . reject ( 'incorrect form submission' ) ;
8
+ }
9
+ return db . select ( 'email' , 'hash' ) . from ( 'login' )
10
+ . where ( 'email' , '=' , email )
11
+ . then ( data => {
12
+ const isValid = bcrypt . compareSync ( password , data [ 0 ] . hash )
13
+ if ( isValid ) {
14
+ return db . select ( '*' ) . from ( 'users' )
15
+ . where ( 'email' , '=' , email )
16
+ . then ( user => user [ 0 ] )
17
+ . catch ( err => Promise . reject ( 'unable to get user' ) )
18
+ } else {
19
+ Promise . reject ( 'invalid credentials' )
20
+ }
21
+ } )
22
+ . catch ( err => Promise . reject ( 'invalid credentials' ) )
23
+ }
24
+
25
+ export const getAuthTokenId = ( req , res ) => {
26
+ const { authorization} = req . headers ;
27
+ return redisClient . get ( authorization , ( err , reply ) => {
28
+ if ( err || ! reply ) {
29
+ return res . status ( 400 ) . json ( 'Unauthorised' ) ;
30
+ }
31
+ return res . json ( { id : reply } )
32
+ } )
33
+ }
34
+
35
+ const signToken = ( email ) => {
36
+ const jwtPayload = { email} ;
37
+ return jwt . sign ( jwtPayload , 'JWT_SECRET' ) ;
38
+ }
39
+
40
+ const setToken = ( key , value ) => {
41
+ return Promise . resolve ( redisClient . set ( key , value ) )
42
+ }
43
+
44
+ export const createSession = ( user ) => {
45
+ const { email, id} = user ;
46
+ const token = signToken ( email ) ;
47
+ return setToken ( token , id )
48
+ . then ( ( ) => {
49
+ return { success : 'true' , userId : id , token}
50
+ } )
51
+ . catch ( console . log )
52
+ }
53
+
54
+ export const signinAuthentication = ( db , bcrypt ) => ( req , res ) => {
55
+ const { authorization} = req . headers ;
56
+ return authorization ? getAuthTokenId ( req , res ) :
57
+ handleSignIn ( db , bcrypt , req , res )
58
+ . then ( data => {
59
+ return data . id && data . email ? createSession ( data ) : Promise . reject ( data )
60
+ } )
61
+ . then ( session => res . json ( session ) )
62
+ . catch ( err => res . status ( 400 ) . json ( err ) )
63
+ }
0 commit comments