Pooru/lib/Pooru/Site.pm

112 lines
2.9 KiB
Perl

package Pooru::Site;
use Mojo::Base "Mojolicious", -signatures;
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)
->max_redirects(1);
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;