Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 111 additions & 3 deletions lib/LANraragi/Controller/Api/Search.pm
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ sub handle_api {
my $filter = $req->param('filter');
my $category = $req->param('category') || "";
my $start = $req->param('start') || 0;
my $sortkey = $req->param('sortby');
my $sortkey = $req->param('sortby') || "title";
my $sortorder = $req->param('order');
my $newfilter = $req->param('newonly') // "false";
my $untaggedf = $req->param('untaggedonly') // "false";
Expand Down Expand Up @@ -107,7 +107,7 @@ sub handle_api {
}
}

# Search endpoint returning only archive IDs for a query.
# handle_api but only return archive IDs
sub handle_api_ids {

my $self = shift->openapi->valid_input or return;
Expand All @@ -116,7 +116,7 @@ sub handle_api_ids {
my $filter = $req->param('filter');
my $category = $req->param('category') || "";
my $start = $req->param('start') || 0;
my $sortkey = $req->param('sortby');
my $sortkey = $req->param('sortby') || "title";
my $sortorder = $req->param('order');
my $newfilter = $req->param('newonly') // "false";
my $untaggedf = $req->param('untaggedonly') // "false";
Expand Down Expand Up @@ -153,6 +153,76 @@ sub handle_api_ids {
}
}

# Composite search API with multi-clause OR support.
sub handle_composite {

my $self = shift->openapi->valid_input or return;
my $body = $self->req->json;

my $clauses_raw = $body->{clauses};
my $start = $body->{start} // 0;
my $sortkey = $body->{sortby} || "title";
my $sortorder = ( $body->{order} && $body->{order} eq 'desc' ) ? 1 : 0;
my $grouptanks = $body->{groupby_tanks} // 1;

my ( $total, $filtered, @ids ) = LANraragi::Model::Search::do_composite_search(
$clauses_raw, $start, $sortkey, $sortorder, $grouptanks ? 1 : 0
);

if ( $total eq -1 && $filtered eq -1 ) {

# Search engine not initialized
$self->render(
openapi => {
recordsTotal => 0,
recordsFiltered => 0,
data => []
},
status => 204
);
} else {
$self->render( openapi => get_api_object( $total, $filtered, @ids ) );
}
}

# handle_composite but only return archive IDs
sub handle_composite_ids {

my $self = shift->openapi->valid_input or return;
my $body = $self->req->json;

my $clauses_raw = $body->{clauses};
my $start = $body->{start} // 0;
my $sortkey = $body->{sortby} || "title";
my $sortorder = ( $body->{order} && $body->{order} eq 'desc' ) ? 1 : 0;
my $grouptanks = $body->{groupby_tanks} // 1;

my ( $total, $filtered, @ids ) = LANraragi::Model::Search::do_composite_search(
$clauses_raw, $start, $sortkey, $sortorder, $grouptanks ? 1 : 0
);

if ( $total eq -1 && $filtered eq -1 ) {

# Search engine not initialized
$self->render(
openapi => {
recordsTotal => 0,
recordsFiltered => 0,
data => []
},
status => 204
);
} else {
$self->render(
openapi => {
recordsTotal => $total,
recordsFiltered => $filtered,
data => \@ids
}
);
}
}

sub clear_cache {
invalidate_cache();
render_api_response( shift, "clear_cache" );
Expand Down Expand Up @@ -180,6 +250,44 @@ sub get_random_archives {
$grouptanks eq "true",
$hidecompleted eq "true"
);

render_random_archives( $self, $random_count, @ids );
}

# Pull random archives out of a given composite search
sub get_random_archives_composite {

my $self = shift->openapi->valid_input or return;
my $body = $self->req->json;

my $clauses_raw = $body->{clauses};
my $grouptanks = $body->{groupby_tanks} // 1;
my $random_count = $body->{count} // 5;

# Use the search engine to get IDs matching the clause set, with start=-1 to get all data
my ( $total, $filtered, @ids ) = LANraragi::Model::Search::do_composite_search(
$clauses_raw, -1, "title", 0, $grouptanks ? 1 : 0
);

if ( $total eq -1 && $filtered eq -1 ) {

# Search engine not initialized
$self->render(
openapi => {
data => [],
recordsTotal => 0
},
status => 204
);
return;
}

render_random_archives( $self, $random_count, @ids );
}

# Render up to $random_count archives picked at random out of @ids.
sub render_random_archives ( $self, $random_count, @ids ) {

my @random_ids;

$random_count = min( $random_count, scalar(@ids) );
Expand Down
Loading
Loading