Bug 33146: Add public items lookup route

This patch adds a /public equivilent to the item listing endpoint.

This allows us to search for an item by it's external_id (barcode).

Test plan
1. Apply patch
2. Perform a GET on /api/v1/public/items?external_id=some_barcode
3. Confirm that the above endpoint correctly returns items that should
   be visible in the OPAC

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Bug 33146: (QA follow-up) Do not delete all items in test

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Bug 33146: Allow embedding expanded coded values

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Bug 33146: (QA follow-up) Consistency with /biblios/:biblio_id/items

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Bug 33146: (QA follow-up) Make sure public API enabled for tests

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Martin Renvoize 2022-07-19 11:56:56 +01:00 committed by Tomas Cohen Arazi
parent bb5d95749b
commit b0a570796c
No known key found for this signature in database
GPG Key ID: 0A272EA1B2F3C15F
5 changed files with 121 additions and 13 deletions

View File

@ -58,6 +58,32 @@ sub list {
};
}
=head3 list_public
Controller function that handles listing Koha::Item objects available to the opac
=cut
sub list_public {
my $c = shift->openapi->valid_input or return;
return try {
my $patron = $c->stash('koha.user');
my $items_set =
Koha::Items->filter_by_visible_in_opac( { patron => $patron } );
my $items = $c->objects->search($items_set);
return $c->render(
status => 200,
openapi => $items
);
}
catch {
$c->unhandled_exception($_);
};
}
=head3 get
Controller function that handles retrieving a single Koha::Item

View File

@ -525,6 +525,16 @@
- $ref: "../swagger.yaml#/parameters/q_param"
- $ref: "../swagger.yaml#/parameters/q_body"
- $ref: "../swagger.yaml#/parameters/q_header"
- name: x-koha-embed
in: header
required: false
description: Embed list sent as a request header
type: array
items:
type: string
enum:
- +strings
collectionFormat: csv
consumes:
- application/json
produces:

View File

@ -396,3 +396,64 @@
x-koha-authorization:
permissions:
reserveforothers: place_holds
"/public/items":
get:
x-mojo-to: Items#list_public
operationId: listItemsPublic
tags:
- items
summary: List items publically visible
parameters:
- name: external_id
in: query
description: Search on the item's barcode
required: false
type: string
- $ref: "../swagger.yaml#/parameters/match"
- $ref: "../swagger.yaml#/parameters/order_by"
- $ref: "../swagger.yaml#/parameters/page"
- $ref: "../swagger.yaml#/parameters/per_page"
- $ref: "../swagger.yaml#/parameters/q_param"
- $ref: "../swagger.yaml#/parameters/q_body"
- $ref: "../swagger.yaml#/parameters/q_header"
- $ref: "../swagger.yaml#/parameters/request_id_header"
- name: x-koha-embed
in: header
required: false
description: Embed list sent as a request header
type: array
items:
type: string
enum:
- +strings
collectionFormat: csv
consumes:
- application/json
produces:
- application/json
responses:
"200":
description: A list of item
schema:
type: array
items:
$ref: "../swagger.yaml#/definitions/item"
"401":
description: Authentication required
schema:
$ref: "../swagger.yaml#/definitions/error"
"403":
description: Access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
"500":
description: |
Internal server error. Possible `error_code` attribute values:
* `internal_server_error`
schema:
$ref: "../swagger.yaml#/definitions/error"
"503":
description: Under maintenance
schema:
$ref: "../swagger.yaml#/definitions/error"

View File

@ -291,6 +291,8 @@ paths:
$ref: "./paths/patrons_password.yaml#/~1patrons~1{patron_id}~1password~1expiration_date"
"/public/biblios/{biblio_id}":
$ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}"
"/public/items":
$ref: "./paths/items.yaml#/~1public~1items"
"/public/biblios/{biblio_id}/items":
$ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}~1items"
"/public/biblios/{biblio_id}/ratings":

View File

@ -27,6 +27,8 @@ use Test::Warn;
use t::lib::TestBuilder;
use t::lib::Mocks;
use Mojo::JSON qw(encode_json);
use C4::Auth;
use Koha::Items;
use Koha::Database;
@ -105,15 +107,17 @@ subtest 'list_public() tests' => sub {
$schema->storage->txn_begin;
# Clean out all demo items
Koha::Items->delete();
my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
my $mocked_category = Test::MockModule->new('Koha::Patron::Category');
my $exception = 1;
$mocked_category->mock( 'override_hidden_items', sub {
return $exception;
});
my $mocked_category = Test::MockModule->new('Koha::Patron::Category');
$mocked_category->mock(
'override_hidden_items',
sub {
return $exception;
}
);
my $password = 'thePassword123';
$patron->set_password( { password => $password, skip_validation => 1 } );
@ -186,28 +190,33 @@ subtest 'list_public() tests' => sub {
return $rules;
});
my $query = encode_json({ item_id => [ $item_1->id, $item_2->id, $item_3->id, $item_4->id, $item_5->id, $item_6->id ] });
t::lib::Mocks::mock_preference( 'RESTPublicAPI', 1 );
subtest 'anonymous access' => sub {
plan tests => 21;
t::lib::Mocks::mock_preference( 'RESTPublicAnonymousRequests', 1 );
t::lib::Mocks::mock_preference( 'hidelostitems', 0 );
my $res = $t->get_ok( "/api/v1/public/items" )->status_is(200)->tx->res->json;
my $res = $t->get_ok( "/api/v1/public/items?q=" . $query )->status_is(200)->tx->res->json;
is( scalar @{ $res }, 6, 'No rules set, hidelostitems unset, all items returned');
t::lib::Mocks::mock_preference( 'hidelostitems', 1 );
$res = $t->get_ok( "/api/v1/public/items" )->status_is(200)->tx->res->json;
$res = $t->get_ok( "/api/v1/public/items?q=" . $query )->status_is(200)->tx->res->json;
is( scalar @{ $res }, 3, 'No rules set, hidelostitems set, 3 items hidden');
t::lib::Mocks::mock_preference( 'hidelostitems', 0 );
$rules = { biblionumber => [ $biblio->biblionumber ] };
$res = $t->get_ok( "/api/v1/public/items" )->status_is(200)->tx->res->json;
$res = $t->get_ok( "/api/v1/public/items?q=" . $query )->status_is(200)->tx->res->json;
is( scalar @{ $res }, 0, 'Biblionumber rule set, hidelostitems unset, all items hidden');
$rules = { withdrawn => [ 1, 2 ] };
$res = $t->get_ok( "/api/v1/public/items" )->status_is(200)->tx->res->json;
$res = $t->get_ok( "/api/v1/public/items?q=" . $query )->status_is(200)->tx->res->json;
is( scalar @{ $res }, 4, 'Withdrawn rule set, hidelostitems unset, 2 items hidden');
$rules = { itype => [ $itype_1->itemtype ] };
$res = $t->get_ok( "/api/v1/public/items" )->status_is(200)->tx->res->json;
$res = $t->get_ok( "/api/v1/public/items?q=" . $query )->status_is(200)->tx->res->json;
is( scalar @{ $res }, 2, 'Itype rule set, hidelostitems unset, 4 items hidden');
$rules = { withdrawn => [ 1 ] };
@ -228,7 +237,7 @@ subtest 'list_public() tests' => sub {
t::lib::Mocks::mock_preference( 'hidelostitems', 1 );
$rules = { withdrawn => [ 1, 2 ] };
my $res = $t->get_ok("//$userid:$password@/api/v1/public/items")
my $res = $t->get_ok("//$userid:$password@/api/v1/public/items?q=" . $query)
->status_is(200)->tx->res->json;
is(
scalar @{$res},