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/")->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;