@@ -, +, @@ headers, returns an empty result when the query is empty --- Koha/REST/V1/Biblios.pm | 65 +++++++++++++++++++++++-------- api/v1/swagger/paths/biblios.yaml | 3 ++ 2 files changed, 51 insertions(+), 17 deletions(-) --- a/Koha/REST/V1/Biblios.pm +++ a/Koha/REST/V1/Biblios.pm @@ -161,37 +161,68 @@ sub get_biblios_public { my ( $error, $results, $total_hits ) = $searcher->simple_search_compat( $query, 0, undef ); - if ( !$total_hits ) { - return $c->render( - status => 404, - openapi => { error => 'Nothing found.' } - ); - } - return try { my $patron = $c->stash('koha.user'); my $is_public = $c->stash('is_public'); my $opachiddenitems_rules = C4::Context->yaml_preference('OpacHiddenItems'); - my $searchengine = C4::Context->preference('SearchEngine'); - - my @biblionumbers - = $searchengine eq 'Zebra' - ? map { MARC::Record->new_from_xml( $_, 'UTF-8' )->field('999')->subfield('c') } $results->@* - : map { $_->field('999')->subfield('c') } $results->@*; + my @biblionumbers; + foreach my $res ( @$results ) { + my $bibno = $searcher->extract_biblionumber( $res ); + push @biblionumbers, $bibno if $bibno; + } my @biblios = map { Koha::Biblios->find( { biblionumber => $_ } ) } @biblionumbers; - my @records = map { + my @records; + foreach( @biblios ) { + next if ( $is_public + && !( $patron && $patron->category->override_hidden_items ) + && $_->hidden_in_opac( { rules => $opachiddenitems_rules } ) ); + push @records => $_->metadata->record; + } + + # Extract reserved params + my ( $filtered_params, $reserved_params, $path_params ) = $c->extract_reserved_params( $c->validation->output ); + $reserved_params->{_per_page} //= C4::Context->preference('RESTdefaultPageSize'); + $reserved_params->{_page} //= 1; + my $offset = $reserved_params->{_per_page} * ($reserved_params->{_page} - 1); + $offset = 0 if $offset < 0; + + my $total = scalar @records; + my @paged_records; + for ( my $i = $offset ; $i < ( $offset + $reserved_params->{_per_page} < $total ? $offset + $reserved_params->{_per_page} : $total ) ; $i++ ) { + push @paged_records, $records[$i]; + } + + #Calculate the total record by removing the record hidden in opac + my $biblios = Koha::Biblios->search(); + @biblionumbers = (); + while ( my $biblio = $biblios->next ) { + push @biblionumbers, $biblio->biblionumber if $biblio->biblionumber; + } + @biblios = map { Koha::Biblios->find( { biblionumber => $_ } ) } @biblionumbers; + my $base_total = 0; + foreach( @biblios ) { next if ( $is_public && !( $patron && $patron->category->override_hidden_items ) && $_->hidden_in_opac( { rules => $opachiddenitems_rules } ) ); - $_->metadata->record; - } @biblios; + $base_total++; + } + + $c->add_pagination_headers( + { + base_total => $base_total, + page => $reserved_params->{_page}, + per_page => $reserved_params->{_per_page}, + query_params => $reserved_params->{_q_params}, + total => ( $reserved_params->{_page} ? $total : $reserved_params->{_per_page} ), + } + ); $c->respond_to( mij => { status => 200, format => 'mij', - data => '[' . ( join ',', map { $_->to_mij } @records ) . ']', + data => '[' . ( join ',', map { $_->to_mij } @paged_records ) . ']', }, any => { status => 406, --- a/api/v1/swagger/paths/biblios.yaml +++ a/api/v1/swagger/paths/biblios.yaml @@ -463,6 +463,9 @@ summary: Get biblios (public) parameters: - $ref: "../swagger.yaml#/parameters/q_ccl" + - $ref: "../swagger.yaml#/parameters/page" + - $ref: "../swagger.yaml#/parameters/per_page" + - $ref: "../swagger.yaml#/parameters/q_param" produces: - application/marc-in-json responses: --