Bug 20212: Remove fix_query and assume ugliness

It seems better to do things in an ugly way but simple than complicated.
This patch removes the fix_query method that deals with ean and isbn and
explicitly tell that it's a trick that must not be reused somewhere
else.
It should only be used by Koha internally and we should not advertised
it until it's ready.
This problem will have to be fixed properly when the GET /biblios route
will be implemented.

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Jonathan Druart 2021-01-13 11:53:15 +01:00
parent 43e0b298bf
commit 24a7fec445

View file

@ -121,14 +121,15 @@ sub list {
$filtered_params //={};
my @query_params_array;
my $query_params;
if ( exists $reserved_params->{query} and defined $reserved_params->{query} ) {
push @query_params_array, fix_query({ query => $reserved_params->{query} });
}
if ( exists $reserved_params->{q} and defined $reserved_params->{q}) {
push @query_params_array, fix_query({ query => decode_json($reserved_params->{q}) });
}
if ( exists $reserved_params->{'x-koha-query'} and defined $reserved_params->{'x-koha-query'} ) {
push @query_params_array, fix_query({ query => decode_json($reserved_params->{'x-koha-query'}) });;
# FIXME The following lines are an ugly fix to deal with isbn and ean searches
# This must NOT be reused or extended
# Instead we need a better and global solution in a Koha::*Biblio method
for my $q ( qw( q query x-koha-query ) ) {
next unless $reserved_params->{$q};
$reserved_params->{$q} =~ s|"biblio.isbn":|"biblio.biblioitem.isbn":|g;
$reserved_params->{$q} =~ s|"biblio.ean":|"biblio.biblioitem.ean":|g;
push @query_params_array, $reserved_params->{$q};
}
if(scalar(@query_params_array) > 1) {
@ -292,78 +293,4 @@ sub delete {
};
}
=head2 Internal methods
=head3 fix_query
my $query = fix_query($query);
This method takes care of recursively fixing queries that should be done
against biblioitems (instead if biblio as exposed on the API)
=cut
sub fix_query {
my ($args) = @_;
my $query = $args->{query};
my $biblioitem_fields = {
'biblio.age_restriction' => 'biblio.biblioitem.age_restriction',
'biblio.cn_class' => 'biblio.biblioitem.cn_class',
'biblio.cn_item' => 'biblio.biblioitem.cn_item',
'biblio.cn_sort' => 'biblio.biblioitem.cn_sort',
'biblio.cn_source' => 'biblio.biblioitem.cn_source',
'biblio.cn_suffix' => 'biblio.biblioitem.cn_suffix',
'biblio.collection_issn' => 'biblio.biblioitem.collection_issn',
'biblio.collection_title' => 'biblio.biblioitem.collection_title',
'biblio.collection_volume' => 'biblio.biblioitem.collection_volume',
'biblio.ean' => 'biblio.biblioitem.ean',
'biblio.edition_statement' => 'biblio.biblioitem.edition_statement',
'biblio.illustrations' => 'biblio.biblioitem.illustrations',
'biblio.isbn' => 'biblio.biblioitem.isbn',
'biblio.issn' => 'biblio.biblioitem.issn',
'biblio.item_type' => 'biblio.biblioitem.item_type',
'biblio.lc_control_number' => 'biblio.biblioitem.lc_control_number',
'biblio.material_size' => 'biblio.biblioitem.material_size',
'biblio.notes' => 'biblio.biblioitem.notes',
'biblio.number' => 'biblio.biblioitem.number',
'biblio.pages' => 'biblio.biblioitem.pages',
'biblio.publication_place' => 'biblio.biblioitem.publication_place',
'biblio.publication_year' => 'biblio.biblioitem.publication_year',
'biblio.publisher' => 'biblio.biblioitem.publisher',
'biblio.serial_total_issues' => 'biblio.biblioitem.serial_total_issues',
'biblio.url' => 'biblio.biblioitem.url',
'biblio.volume' => 'biblio.biblioitem.volume',
'biblio.volume_date' => 'biblio.biblioitem.volume_date',
'biblio.volume_description' => 'biblio.biblioitem.volume_description',
};
if ( ref($query) eq 'HASH' ) {
foreach my $key (keys %{$query}) {
if ( exists $biblioitem_fields->{$key}) {
my $subq = delete $query->{$key};
$query->{$biblioitem_fields->{$key}} = (ref($subq) eq 'HASH')
? fix_query({ query => $subq })
: $subq;
}
else {
$query->{$key} = fix_query({ query => $query->{$key} });
}
}
}
elsif ( ref($query) eq 'ARRAY' ) {
my @accum;
foreach my $item (@{$query}) {
push @accum, fix_query({ query => $item });
}
$query = \@accum;
}
else { # scalar
$query = $biblioitem_fields->{$query}
if exists $biblioitem_fields->{$query};
}
return $query;
}
1;