api/v0: inline listing helpers

This commit is contained in:
Lucas Gabriel Vuotto 2025-05-03 17:18:47 +00:00
parent 9d8b300d11
commit 37802a2aa1

View file

@ -5,35 +5,6 @@ use Mojo::Base "Mojolicious::Controller";
use List::Util qw(uniq); use List::Util qw(uniq);
sub _list_no_tags ($self, $page)
{
my $paged_media = $self->media_model->get->page($page);
return $self->render(json => {
media => $paged_media->fetchall,
pager => $paged_media->pager,
});
}
sub _list_with_tags ($self, $page, @tags)
{
my $paged_media_ids = $self->media_model->with_all_tags(@tags)
->page($page);
my @media_ids = map {$_->{media_id}} $paged_media_ids->fetchall->@*;
return $self->render(
json => {error => "No matching media found."},
status => 404,
) if @media_ids == 0;
return $self->render(json => {
media => $self->media_model->get(@media_ids)->page($page)
->fetchall,
# Use the original pager, as the one for the media is already
# capped at the size of a single page.
pager => $paged_media_ids->pager,
});
}
sub list ($self) sub list ($self)
{ {
my $v = $self->validation; my $v = $self->validation;
@ -55,18 +26,36 @@ sub list ($self)
status => 400, status => 400,
) if @tags > Pooru::API::V0::Model::Tags::ROWS; ) if @tags > Pooru::API::V0::Model::Tags::ROWS;
my @tag_ids; my ($media, $pager);
@tag_ids = map {$_->{id}} $self->tags_model if (@tags > 0) {
->get(display => [@tags])->fetchall->@* if @tags > 0; my @tag_ids = map {$_->{id}} $self->tags_model
->get(display => [@tags])->fetchall->@*;
return $self->render( return $self->render(
json => {error => "Some of the requested tags don't exist."}, json => {error => "Some of the requested tags " .
status => 400, "don't exist."},
) if @tag_ids != @tags && @tags > 0; status => 400,
) if @tag_ids != @tags;
return @tags == 0 ? my $paged_media_ids = $self->media_model
$self->_list_no_tags($page) : ->with_all_tags(@tag_ids)->page($page);
$self->_list_with_tags($page, @tag_ids); my @media_ids = map {$_->{media_id}} $paged_media_ids->
fetchall->@*;
return $self->render(
json => {error => "No matching media found."},
status => 404,
) if @media_ids == 0;
$media = $self->media_model
->get(@media_ids)->page($page)->fetchall;
$pager = $paged_media_ids->pager;
} else {
my $paged_media = $self->media_model->get->page($page);
$media = $paged_media->fetchall;
$pager = $paged_media->pager;
}
return $self->render(json => {media => $media, pager => $pager});
} }
sub show ($self) sub show ($self)