I refactored some of my code:
Summary: This implementation works with PSGI/Plack. It gets the URL from $env->{PATH_INFO}
and assigns a different variable according to the value in the URL with regex.
This approach can redirect users to an existing URL in the router system. It also remembers the last page the user visited and detects if the URL has a string with 10 digits (token). All this is done via session file.
The previous code:
my $app = sub {
my $env = shift;
my $form = $env->{' Auth::Form.LoginForm'};
my $token = $env->{'psgix.session'}{token};
my $fromreferer = $env->{PATH_INFO};
my $onfirstnameapp;
if ($fromreferer eq '/'){
$onfirstnameapp = '';
$env->{'psgix.session'}{equal_root} = 'equal_root';
}
elsif(grep(/(nameapp\d{11})/, $fromreferer)){
$env->{'psgix.session'}{greather_ten_digits} = 'greather_ten_digits';
$onfirstnameapp = '/greather_ten_digits';
}
elsif(grep(/(nameapp\d{10})/, $fromreferer)){
$env->{'psgix.session'}{equal_ten} = 'equal_ten';
$onfirstnameapp = $1 if $fromreferer =~ /.:?(nameapp\d{10})\/?/;
}
else{
$env->{'psgix.session'}{not_root_notroute} = 'not_root_notroute';
$onfirstnameapp = $fromreferer . '/not_root_notroute';
}
my $onlineafterAppurl = $1 if $fromreferer =~ /.:?nameapp\d+(\/.*)/;
$env->{'psgix.session'}{current_request} = $onfirstnameapp;
if($env->{'psgix.session'}{user_id}){
my $get_old_token = $env->{'psgix.session'}{old_token};
my $offtoken = $env->{'psgix.session'}{offtoken};
my ($code) = $router->match($env->{PATH_INFO});
if ( $onfirstnameapp ne $token ){
$env->{'psgix.session'}{no_token_equal} = 'no_token_equal';
check_url_exist_inrouter($onlineafterAppurl);
# }
if (grep(/$onlineafterAppurl/, @resulturlcheck) or
(grep(/(nameapp\d{10})/, $offtoken) && $onlineafterAppurl eq '') ) {
delete $env->{'psgix.session'}{offtoken} if $onlineafterAppurl eq '';
$onlineafterAppurl = "/$handler" if $onlineafterAppurl eq '';
if( $onfirstnameapp eq $offtoken || $onfirstnameapp eq $get_old_token ) {
$env->{'psgix.session'}{menus_router_boom_off} = 'off work';
return [
302,
[ Location => URI->new('/' . $token . $onlineafterAppurl) ],
[ '' ]
];
}
}
};
return ["404", ["Content-Type" => "text/html"], ["Not Found, go to : <a href='/'>Home</a> " ] ] unless $code;
return $code->($env);
}
if ($fromreferer ne '/'){
return ["401", ["Content-Type" => "text/html"],
[ $form ]
];
}
return ["404", ["Content-Type" => "text/html"], [ $form ]];
};
The current code refactory:
my $app = sub {
my $env = shift;
my @all_urls_names = @{$env->{all_urls_names}};
my $router = Routerapp->new;
my %set = (
handler => $all_urls_names[0],
tk => '/' . $env->{'psgix.session'}{token},
fromreferer => $env->{PATH_INFO},
token => $env->{'psgix.session'}{token},
form => $env->{theform},
user => $env->{'psgix.session'}{user_id},
offtoken_form => $env->{'psgix.session'}{offtoken},
get_old_token_form => $env->{'psgix.session'}{old_token},
);
my $onfirsnameapp;
my $onafterappurl //= ''; #here I set a empty value to avoid unitialized value
$onfirsnameapp = do {
if ($set{fromreferer} eq '/') {''}
elsif (grep(/(tapp\d{11})/, $set{fromreferer})) {'/greather_ten_digits'}
elsif (grep(/(tapp\d{10})/, $set{fromreferer})){ $1 if $set{fromreferer} =~ /.:?(tapp\d{10})\/?/}
else {$set{fromreferer} . '/not_root_notroute'}
};
my %add_sesion = (
equal_ten => sub { $env->{'psgix.session'}{equal_ten} = 'equal_ten' if grep( /(tapp\d{10})/, $onfirsnameapp ); },
current_request => sub { $env->{'psgix.session'}{current_request} = $onfirsnameapp; },
no_tkn_equal => sub { $env->{'psgix.session'}{no_tkn_equal} = 'no_tkn_equal'; },
menus_router_off => sub { $env->{'psgix.session'}{menus_router_off} = 'off work'; },
);
$add_sesion{equal_ten}->();
$add_sesion{current_request}->();
if($set{user}){
my ($code) = $router->match($env->{PATH_INFO});
if ( $set{onfirsnameapp} ne $set{token} ){
$onafterappurl = $1 if $set{fromreferer} =~ /.:?tapp\d+\/(.*)/;
$add_sesion{no_tkn_equal}->();
if (grep(/$onafterappurl/, @all_urls_names)
or (grep(/(tapp\d{10})/, $set{offtoken_form})
&& $onafterappurl eq '')
) {
delete $env->{'psgix.session'}{offtoken_form} if $onafterappurl eq '';
if( $onfirsnameapp eq $set{offtoken_form} || $onfirsnameapp eq $set{get_old_token_form} ) {
$add_sesion{menus_router_off}->();
return [
302,
[ Location => URI->new('/' . $set{token} . '/' . $onafterappurl) ],
[ '' ]
];
}
}
}; #here finish is not equal to token
return ["404", ["Content-Type" => "text/html"], ["Not Found, go to : <a href='/'>Home </a> " ] ] unless $code;
return $code->($env);
}
if ($set{fromreferer} ne '/'){
return ["401", ["Content-Type" => "text/html"],
[ $set{form} ]
];
}
return ["404", ["Content-Type" => "text/html"], [ $set{form} ]];
}
Is my refactoring good enough?
use
lines in there. \$\endgroup\$$router
. We don't really need to know what it does, but in terms of refactored code it should still do the same, so it would be useful to see all relevant parts of the old code to make an assessment. \$\endgroup\$