2017-04-06 22:43:27 +01:00
package Pear::LocalLoop::Controller::Api::Auth ;
2017-02-24 19:27:43 +00:00
use Mojo::Base 'Mojolicious::Controller' ;
use Data::Dumper ;
2017-04-18 23:43:49 +01:00
use Mojo::JSON qw/ decode_json / ;
2017-02-24 19:27:43 +00:00
2017-04-18 22:31:08 +01:00
has error_messages = > sub {
return {
email = > {
required = > { message = > 'No email sent.' , status = > 400 } ,
email = > { message = > 'Email is invalid.' , status = > 400 } ,
} ,
password = > {
required = > { message = > 'No password sent.' , status = > 400 } ,
} ,
} ;
} ;
2017-04-20 01:27:18 +01:00
sub check_json {
2017-04-18 22:31:08 +01:00
my $ c = shift ;
2017-04-20 01:27:18 +01:00
# JSON object is either the whole request, or under a json param for upload
my $ json = $ c - > req - > json || decode_json ( $ c - > param ( 'json' ) || '{}' ) ;
2017-04-18 22:31:08 +01:00
2017-04-20 01:27:18 +01:00
unless ( defined $ json && ref $ json eq 'HASH' && scalar ( keys %$ json ) > 0 ) {
$ c - > render (
json = > {
success = > Mojo::JSON - > false ,
message = > 'JSON is missing.' ,
} ,
status = > 400 ,
) ;
return 0 ;
2017-04-18 23:43:49 +01:00
}
2017-04-20 01:27:18 +01:00
$ c - > stash ( api_json = > $ json ) ;
return 1 ;
}
2017-02-24 19:27:43 +00:00
2017-04-20 01:27:18 +01:00
sub auth {
my $ c = shift ;
my $ session_key = $ c - > stash - > { api_json } - > { session_key } ;
if ( defined $ session_key ) {
2017-04-21 22:12:53 +01:00
my $ session_result = $ c - > schema - > resultset ( 'SessionToken' ) - > find ( { token = > $ session_key } ) ;
2017-04-20 01:27:18 +01:00
if ( defined $ session_result ) {
$ c - > stash ( api_user = > $ session_result - > user ) ;
return 1 ;
}
2017-04-18 22:31:08 +01:00
}
$ c - > render (
json = > {
success = > Mojo::JSON - > false ,
message = > 'Invalid Session' ,
} ,
status = > 401 ,
) ;
return 0 ;
2017-02-24 19:27:43 +00:00
}
2020-11-28 19:53:19 +00:00
sub test_connection {
my $ c = shift ;
return $ c - > render (
json = > {
success = > Mojo::JSON - > true ,
message = > 'Database connection successful' ,
} ,
status = > 200 ,
) ;
}
2017-02-24 19:27:43 +00:00
sub post_login {
2017-04-18 22:31:08 +01:00
my $ c = shift ;
2017-02-24 19:27:43 +00:00
2017-04-18 22:31:08 +01:00
my $ validation = $ c - > validation ;
2017-04-20 01:27:18 +01:00
$ validation - > input ( $ c - > stash - > { api_json } ) ;
2017-04-18 22:31:08 +01:00
$ validation - > required ( 'email' ) - > email ;
$ validation - > required ( 'password' ) ;
2017-04-20 01:27:18 +01:00
return $ c - > api_validation_error if $ validation - > has_error ;
2017-04-18 22:31:08 +01:00
my $ email = $ validation - > param ( 'email' ) ;
my $ password = $ validation - > param ( 'password' ) ;
2017-11-21 10:40:22 +00:00
$ c - > app - > log - > debug ( __PACKAGE__ . " login attempt for [" . $ email . "]" ) ;
2017-04-18 22:31:08 +01:00
my $ user_result = $ c - > schema - > resultset ( 'User' ) - > find ( { email = > $ email } ) ;
2017-07-26 15:29:38 +01:00
2017-04-18 22:31:08 +01:00
if ( defined $ user_result ) {
if ( $ user_result - > check_password ( $ password ) ) {
2017-04-21 22:12:53 +01:00
my $ session_key = $ user_result - > generate_session ;
2017-04-18 22:31:08 +01:00
return $ c - > render ( json = > {
success = > Mojo::JSON - > true ,
session_key = > $ session_key ,
2020-11-08 17:35:29 +00:00
email = > $ email ,
2017-08-25 14:59:15 +01:00
display_name = > $ user_result - > name ,
user_type = > $ user_result - > type ,
2017-04-18 22:31:08 +01:00
} ) ;
2017-11-21 10:40:22 +00:00
} else {
$ c - > app - > log - > info ( __PACKAGE__ . " failed login for [" . $ email . "]" ) ;
2017-04-18 22:31:08 +01:00
}
2017-02-24 19:27:43 +00:00
}
2017-07-20 17:34:33 +01:00
return $ c - > render (
json = > {
success = > Mojo::JSON - > false ,
message = > 'Email or password is invalid.' ,
} ,
status = > 401
) ;
2017-04-18 22:31:08 +01:00
}
2017-02-24 19:27:43 +00:00
2017-04-18 22:31:08 +01:00
sub post_logout {
my $ c = shift ;
2017-02-24 19:27:43 +00:00
2017-04-18 22:31:08 +01:00
my $ session_key = $ c - > req - > json ( '/session_key' ) ;
2017-02-24 19:27:43 +00:00
2017-04-21 22:12:53 +01:00
my $ session_result = $ c - > schema - > resultset ( 'SessionToken' ) - > find ( { token = > $ session_key } ) ;
2017-02-24 19:27:43 +00:00
2017-04-18 22:31:08 +01:00
if ( defined $ session_result ) {
$ session_result - > delete ;
2017-02-24 19:27:43 +00:00
}
2017-04-18 22:31:08 +01:00
$ c - > render ( json = > {
success = > Mojo::JSON - > true ,
message = > 'Logged Out' ,
2017-07-26 15:29:38 +01:00
} ) ;
2017-02-24 19:27:43 +00:00
}
1 ;