pgc-www/lib/MyApp.pm

98 lines
2.8 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');
# Apply local overrides, if any.
if (-e $self->home->child('local-override.yml')) {
$config = $self->plugin('NotYAMLConfig', { file => 'local-override.yml' });
}
$self->secrets([ $config->{secrets} ]);
# Add home-made helper(s).
$self->add_my_helpers;
# Set routes.
my $r = $self->routes;
$r->get('/<page_number:num>')->to('book#books', page_number => 1)->name('books');
$r->get('/about')->to('book#about')->name('about');
$r->get('/authors/<page_number:num>')
->to('book#authors', page_number => 1)->name('authors');
$r->get('/author/<id:num>/<page_number:num>')->to('book#author')->name('author');
$r->post('/set_rpp')->to('book#set_rpp')->name('set_rpp');
}
1;