pgc-www/lib/MyApp.pm
barnold 5cc21a2e7a Take the rpp preference out of auth...
and put it in the layout. The form response now redirects back to the current
page. Catch: if on the last page and you increase rpp, it redirects beyond
the last page and therefore 404s.
2022-09-29 10:59:37 +01:00

112 lines
3.3 KiB
Perl

package MyApp;
use Mojo::Base 'Mojolicious', -signatures;
# Define home-made helpers.
sub add_my_helpers ($self) {
$self->helper(
# Return either the nonnegative integer that $maybe_nn is or
# resembles, or return undef if it looks bogus. There's surely
# a utility somewhere to do this already but I didn't find it.
accept_nnint => sub ($self, $maybe_nn) {
my $verdict = do {
if ((defined $maybe_nn) && ($maybe_nn =~ m/^[[:digit:]]+$/)) {
$maybe_nn;
} elsif ((!defined $maybe_nn) || ($maybe_nn eq '')) {
0;
} else {
undef;
}
};
return $verdict;
}
);
$self->helper(
accept_posint => sub ($self, $maybe_nn) {
my $maybe_pos = $self->accept_nnint($maybe_nn);
return ((defined $maybe_pos) && 0 < $maybe_pos)
? $maybe_pos : undef ;
}
);
$self->helper(
commify => sub ($self, $number) {
my $rev = reverse $number;
while ($rev =~ s/(\d{3})(\d)/$1,$2/) {};
return scalar reverse $rev;
}
);
$self->helper(
default_rpp => sub ($self) {
return $self->config->{'default-rows-per-page'};
}
);
$self->helper(
gutenberg_url => sub ($self, $gid) {
return "https://gutenberg.org/ebooks/" . $gid;
}
);
$self->helper(
logname => sub ($self) { $self->session('logname'); }
);
$self->helper(
max_rpp => sub ($self) {
return $self->config->{'maximum-rows-per-page'};
}
);
$self->helper(
rpp => sub ($self) {
$self->session('rows_per_page') // $self->default_rpp;
}
);
$self->helper(
trct => sub ($self, $str, $len) {
do {
if (length($str) <= $len) {
$str;
} else {
substr($str, 0, $len - 1) . '…';
}
};
}
);
return;
}
sub startup ($self) {
# Set a "secret" for signing cookies, preventing "Your secret
# passphrase needs to be changed" in the log, using my_app.yml.
my $config = $self->plugin('NotYAMLConfig');
$self->secrets([ $config->{secrets} ]);
# Add home-made helper(s).
$self->add_my_helpers;
# Set routes.
my $r = $self->routes;
# Home gets an explicit name, else its name is an empty string. A
# route's default name seems to come from '/path' with the leading
# '/' removed.
$r->get('/')->to('home#index')->name('home');
$r->get('/about')->to('home#about');
$r->get('/auth')->to('auth#index');
$r->post('/login')->to('auth#login');
$r->get('/logout')->to('auth#logout');
$r->get('/books/<page_number:num>')->to('book#books')->name('books');
$r->get('/authors/<page_number:num>')->to('book#authors')->name('authors');
$r->get('/author/<id:num>/<page_number:num>')->to('book#author')->name('author');
$r->post('/preferences')->to('auth#preferences')->name('preferences');
# Put a route under athentication.
my $auth = $r->under(
'/' => sub ($c) {
return 1 if ($c->logname);
$c->flash('naughty' => 1);
$c->session('post_login' => $c->current_route);
$c->redirect_to('auth');
return undef;
}
);
$auth->get('/account')->to('auth#account')->name('account');
}
1;