Bug 23677: Controller method and dependencies tweak

Signed-off-by: Arthur Suzuki <arthur.suzuki@biblibre.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
This commit is contained in:
Tomas Cohen Arazi 2019-09-26 16:23:41 -03:00 committed by Martin Renvoize
parent ac8d9f77a0
commit f67e23c2c2
No known key found for this signature in database
GPG Key ID: 422B469130441A0F
2 changed files with 169 additions and 1 deletions

View File

@ -477,6 +477,11 @@ our $PERL_DEPS = {
'required' => '1',
'min_ver' => '1.86'
},
'MARC::Record::MiJ' => {
'usage' => 'Core',
'required' => '1',
'min_ver' => '0.04'
},
'MARC::File::XML' => {
'usage' => 'Core',
'required' => '1',

View File

@ -22,14 +22,89 @@ use Mojo::Base 'Mojolicious::Controller';
use Koha::Biblios;
use C4::Biblio qw(DelBiblio);
use MARC::Record::MiJ;
use Try::Tiny;
=head1 API
=head2 Class Methods
=head2 Class methods
=head3 get
Controller function that handles retrieving a single biblio object
=cut
sub get {
my $c = shift->openapi->valid_input or return;
my $attributes;
$attributes = { prefetch => [ 'metadata' ] } # don't prefetch metadata if not needed
unless $c->req->headers->accept =~ m/application\/json/;
my $biblio = Koha::Biblios->find( { biblionumber => $c->validation->param('biblio_id') }, $attributes );
unless ( $biblio ) {
return $c->render(
status => 404,
openapi => {
error => "Object not found."
}
);
}
return try {
if ( $c->req->headers->accept =~ m/application\/json/ ) {
return $c->render(
status => 200,
json => $c->build_json_biblio( { biblio => $biblio } )
);
}
else {
my $record = $biblio->metadata->record;
$c->respond_to(
marcxml => {
status => 200,
format => 'marcxml',
text => $record->as_xml_record
},
mij => {
status => 200,
format => 'mij',
text => $record->to_mij
},
marc => {
status => 200,
format => 'marc',
text => $record->as_usmarc
},
any => {
status => 406,
openapi => [
"application/json",
"application/marcxml+xml",
"application/marc-in-json",
"application/marc"
]
}
);
}
}
catch {
return $c->render(
status => 500,
openapi => { error => "Something went wrong, check the logs ($_)" }
);
};
}
=head3 delete
Controller function that handles deleting a biblio object
=cut
sub delete {
@ -73,4 +148,92 @@ sub delete {
};
}
=head2 Internal methods
=head3 _to_api
Helper function that maps unblessed Koha::Patron objects into REST api
attribute names.
=cut
sub _to_api {
my $biblio = shift;
# Rename attributes
foreach my $column ( keys %{$Koha::REST::V1::Biblios::to_api_mapping} ) {
my $mapped_column = $Koha::REST::V1::Biblios::to_api_mapping->{$column};
if ( exists $biblio->{$column}
&& defined $mapped_column )
{
# key != undef
$biblio->{$mapped_column} = delete $biblio->{$column};
}
elsif ( exists $biblio->{$column}
&& !defined $mapped_column )
{
# key == undef
delete $biblio->{$column};
}
}
return $biblio;
}
=head3 build_json_biblio
Internal method that returns all the attributes from the biblio and biblioitems tables
=cut
sub build_json_biblio {
my ( $c, $args ) = @_;
my $biblio = $args->{biblio};
my $response = $biblio->TO_JSON;
my $biblioitem = $biblio->biblioitem->TO_JSON;
foreach my $key ( keys %{ $biblioitem } ) {
$response->{$key} = $biblioitem->{$key};
}
return _to_api($response);
}
=head2 Global variables
=head3 $to_api_mapping
=cut
our $to_api_mapping = {
agerestriction => 'age_restriction',
biblioitemnumber => undef, # meaningless
biblionumber => 'biblio_id',
collectionissn => 'collection_issn',
collectiontitle => 'collection_title',
collectionvolume => 'collection_volume',
copyrightdate => 'copyright_date',
datecreated => 'creation_date',
editionresponsibility => undef, # obsolete, not mapped
editionstatement => 'edition_statement',
frameworkcode => 'framework_id',
illus => 'illustrations',
itemtype => 'item_type',
lccn => 'lc_control_number',
place => 'publication_place',
publicationyear => 'publication_year',
publishercode => 'publisher',
seriestitle => 'series_title',
size => 'material_size',
totalissues => 'serial_total_issues',
unititle => 'uniform_title',
volumedate => 'volume_date',
volumedesc => 'volume_description',
};
1;