As a really nice consequence, drop max_redirects from Mojo::UserAgent.
113 lines
2.9 KiB
Perl
113 lines
2.9 KiB
Perl
package Pooru::Site;
|
|
use v5.40;
|
|
use Mojo::Base "Mojolicious";
|
|
|
|
use Pooru::Storage::Static;
|
|
|
|
use constant {
|
|
EXTENDED_PAGER_LENGTH => 7,
|
|
};
|
|
|
|
|
|
sub extended_pager ($self, $pager)
|
|
{
|
|
my (%pages, $start, $end, $mid);
|
|
|
|
$mid = int(EXTENDED_PAGER_LENGTH / 2);
|
|
if ($pager->{current_page} < $pager->{first_page} + $mid) {
|
|
$start = $pager->{first_page};
|
|
$end = $start + $mid * 2;
|
|
} elsif ($pager->{current_page} > $pager->{last_page} - $mid) {
|
|
$end = $pager->{last_page};
|
|
$start = $end - $mid * 2;
|
|
} else {
|
|
$start = $pager->{current_page} - $mid;
|
|
$end = $pager->{current_page} + $mid;
|
|
}
|
|
$pages{pages} = [grep {$_ >= $pager->{first_page} &&
|
|
$_ <= $pager->{last_page}} ($start .. $end)];
|
|
|
|
$pages{shortcuts}{first_page} = $pager->{first_page} if
|
|
$pager->{first_page} != $pager->{current_page};
|
|
$pages{shortcuts}{previous_page} = $pager->{previous_page} if
|
|
defined($pager->{previous_page});
|
|
$pages{shortcuts}{next_page} = $pager->{next_page} if
|
|
defined($pager->{next_page});
|
|
$pages{shortcuts}{last_page} = $pager->{last_page} if
|
|
$pager->{last_page} != $pager->{current_page};
|
|
|
|
return %pages;
|
|
}
|
|
|
|
sub tag_for_pager_shortcut ($self, $content, $page) {
|
|
return (defined($page) and $self->link_to($content,
|
|
$self->url_with->query({page => $page})));
|
|
}
|
|
|
|
sub link_for_tag ($self, $tag)
|
|
{
|
|
my $url = $self->url_for("list_media")
|
|
->query(tags => $tag->{display} . " ");
|
|
|
|
defined($tag->{kind_id}) and
|
|
my %class = (class => "tag-kind-$tag->{kind_id}");
|
|
|
|
return $self->link_to($tag->{display} => $url => %class);
|
|
}
|
|
|
|
sub tags_by_kind ($self, $tags)
|
|
{
|
|
my @kinds = qw(Author Character Release Tags);
|
|
my %kind_id = (
|
|
Author => "a",
|
|
Character => "c",
|
|
Release => "r",
|
|
Tags => "",
|
|
);
|
|
|
|
my @tags_by_kind;
|
|
for my $kind (@kinds) {
|
|
my @ts = grep {($_->{kind_id} // "") eq $kind_id{$kind}}
|
|
$tags->@*;
|
|
push @tags_by_kind, {kind => $kind, tags => [@ts]};
|
|
}
|
|
|
|
return @tags_by_kind;
|
|
}
|
|
|
|
sub startup ($self)
|
|
{
|
|
$self->moniker("pooru-site");
|
|
|
|
my $config = $self->plugin("Config");
|
|
$self->secrets($config->{secrets});
|
|
|
|
$self->helper(storage => sub {
|
|
state $storage = Pooru::Storage::Static->
|
|
new($config->{store}, "/s/");
|
|
});
|
|
$self->helper(api_v0_url => sub {
|
|
return Mojo::URL->new($self->config("pooru_api")->{v0});
|
|
});
|
|
$self->helper(extended_pager => \&extended_pager);
|
|
$self->helper(tag_for_pager_shortcut => \&tag_for_pager_shortcut);
|
|
$self->helper(link_for_tag => \&link_for_tag);
|
|
$self->helper(tags_by_kind => \&tags_by_kind);
|
|
|
|
$self->ua
|
|
->connect_timeout(5)
|
|
->inactivity_timeout(5);
|
|
|
|
my $r = $self->routes;
|
|
|
|
$r->get("/")->to("media#list")->name("list_media");
|
|
$r->get("/media/<media_id:num>")->to("media#show")->name("show_media");
|
|
|
|
$r->get("/tags")->to("tags#list")->name("list_tags");
|
|
$r->get("/search")->to("tags#search")->name("search_tags");
|
|
|
|
$r->get("/random/media")->to("random#media")->name("random_media");
|
|
$r->get("/random/tag")->to("random#tag")->name("random_tag");
|
|
}
|
|
|
|
1;
|