Bug 33227: Remove invalid spec and adjust the code accordingly
The spec contains a non-standard definition for the body param. Removing it from the spec makes us need to handle the 'body' manually in the case of JSON data. This patch basically does that. It also changes the uses of $c->validation, which are discouraged by the Mojolicious::Plugin::OpenAPI dev/maintainer. I do it to highlight what we must do in other places and the fact that there's no behavior change. To test: 1. Apply this patch 2. Run: $ ktd --shell k$ prove t/db_dependent/api/v1/biblios.t \ xt/api.t => SUCCESS: Tests pass! 3. Sign off :-D Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
parent
502e34e9b0
commit
185b431ebf
3 changed files with 42 additions and 46 deletions
|
@ -491,21 +491,26 @@ sub add {
|
|||
my $c = shift->openapi->valid_input or return;
|
||||
|
||||
try {
|
||||
my $body = $c->validation->param('Body');
|
||||
my $headers = $c->req->headers;
|
||||
|
||||
my $flavour = $c->validation->param('x-marc-schema');
|
||||
$flavour = C4::Context->preference('marcflavour') unless $flavour;
|
||||
my $flavour = $headers->header('x-marc-schema');
|
||||
$flavour //= C4::Context->preference('marcflavour');
|
||||
|
||||
my $record;
|
||||
|
||||
my $frameworkcode = $c->validation->param('x-framework-id');
|
||||
if ( $c->req->headers->content_type =~ m/application\/marcxml\+xml/ ) {
|
||||
$record = MARC::Record->new_from_xml( $body, 'UTF-8', $flavour );
|
||||
} elsif ( $c->req->headers->content_type =~ m/application\/marc-in-json/ ) {
|
||||
$record = MARC::Record->new_from_mij_structure( $body );
|
||||
} elsif ( $c->req->headers->content_type =~ m/application\/marc/ ) {
|
||||
$record = MARC::Record->new_from_usmarc( $body );
|
||||
} else {
|
||||
my $frameworkcode = $headers->header('x-framework-id');
|
||||
my $content_type = $headers->content_type;
|
||||
|
||||
if ( $content_type =~ m/application\/marcxml\+xml/ ) {
|
||||
$record = MARC::Record->new_from_xml( $c->req->body, 'UTF-8', $flavour );
|
||||
}
|
||||
elsif ( $content_type =~ m/application\/marc-in-json/ ) {
|
||||
$record = MARC::Record->new_from_mij_structure( $c->req->json );
|
||||
}
|
||||
elsif ( $content_type =~ m/application\/marc/ ) {
|
||||
$record = MARC::Record->new_from_usmarc( $c->req->body );
|
||||
}
|
||||
else {
|
||||
return $c->render(
|
||||
status => 406,
|
||||
openapi => [
|
||||
|
@ -519,12 +524,12 @@ sub add {
|
|||
my ( $duplicatebiblionumber, $duplicatetitle );
|
||||
( $duplicatebiblionumber, $duplicatetitle ) = FindDuplicate($record);
|
||||
|
||||
my $confirm_not_duplicate = $c->validation->param('x-confirm-not-duplicate');
|
||||
my $confirm_not_duplicate = $headers->header('x-confirm-not-duplicate');
|
||||
|
||||
return $c->render(
|
||||
status => 400,
|
||||
openapi => {
|
||||
error => "Duplicate biblio $duplicatebiblionumber"
|
||||
error => "Duplicate biblio $duplicatebiblionumber",
|
||||
}
|
||||
) unless !$duplicatebiblionumber || $confirm_not_duplicate;
|
||||
|
||||
|
@ -550,10 +555,10 @@ Controller function that handles modifying an biblio object
|
|||
sub update {
|
||||
my $c = shift->openapi->valid_input or return;
|
||||
|
||||
my $biblionumber = $c->validation->param('biblio_id');
|
||||
my $biblio = Koha::Biblios->find( $biblionumber );
|
||||
my $biblio_id = $c->param('biblio_id');
|
||||
my $biblio = Koha::Biblios->find($biblio_id);
|
||||
|
||||
if ( not defined $biblio ) {
|
||||
if ( ! defined $biblio ) {
|
||||
return $c->render(
|
||||
status => 404,
|
||||
openapi => { error => "Object not found" }
|
||||
|
@ -561,20 +566,27 @@ sub update {
|
|||
}
|
||||
|
||||
try {
|
||||
my $body = $c->validation->param('Body');
|
||||
my $headers = $c->req->headers;
|
||||
|
||||
my $flavour = $c->validation->param('x-marc-schema');
|
||||
$flavour = C4::Context->preference('marcflavour') unless $flavour;
|
||||
my $flavour = $headers->header('x-marc-schema');
|
||||
$flavour //= C4::Context->preference('marcflavour');
|
||||
|
||||
my $frameworkcode = $headers->header('x-framework-id') || $biblio->frameworkcode;
|
||||
|
||||
my $content_type = $headers->content_type;
|
||||
|
||||
my $record;
|
||||
my $frameworkcode = $c->validation->param('x-framework-id') || $biblio->frameworkcode;
|
||||
if ( $c->req->headers->content_type =~ m/application\/marcxml\+xml/ ) {
|
||||
$record = MARC::Record->new_from_xml( $body, 'UTF-8', $flavour );
|
||||
} elsif ( $c->req->headers->content_type =~ m/application\/marc-in-json/ ) {
|
||||
$record = MARC::Record->new_from_mij_structure( $body );
|
||||
} elsif ( $c->req->headers->content_type =~ m/application\/marc/ ) {
|
||||
$record = MARC::Record->new_from_usmarc( $body );
|
||||
} else {
|
||||
|
||||
if ( $content_type =~ m/application\/marcxml\+xml/ ) {
|
||||
$record = MARC::Record->new_from_xml( $c->req->body, 'UTF-8', $flavour );
|
||||
}
|
||||
elsif ( $content_type =~ m/application\/marc-in-json/ ) {
|
||||
$record = MARC::Record->new_from_mij_structure( $c->req->json );
|
||||
}
|
||||
elsif ( $content_type =~ m/application\/marc/ ) {
|
||||
$record = MARC::Record->new_from_usmarc( $c->req->body );
|
||||
}
|
||||
else {
|
||||
return $c->render(
|
||||
status => 406,
|
||||
openapi => [
|
||||
|
@ -586,11 +598,11 @@ sub update {
|
|||
);
|
||||
}
|
||||
|
||||
ModBiblio( $record, $biblionumber, $frameworkcode );
|
||||
ModBiblio( $record, $biblio_id, $frameworkcode );
|
||||
|
||||
$c->render(
|
||||
status => 200,
|
||||
openapi => { id => $biblionumber }
|
||||
openapi => { id => $biblio_id }
|
||||
);
|
||||
}
|
||||
catch {
|
||||
|
|
|
@ -7,14 +7,6 @@
|
|||
- biblios
|
||||
summary: Add biblio
|
||||
parameters:
|
||||
- name: Body
|
||||
in: body
|
||||
description: A JSON object or the Marc string describing a biblio
|
||||
required: true
|
||||
schema:
|
||||
type:
|
||||
- string
|
||||
- object
|
||||
- $ref: "../swagger.yaml#/parameters/framework_id_header"
|
||||
- $ref: "../swagger.yaml#/parameters/marc_schema_header"
|
||||
- $ref: "../swagger.yaml#/parameters/confirm_not_duplicate_header"
|
||||
|
@ -214,14 +206,6 @@
|
|||
summary: Update biblio
|
||||
parameters:
|
||||
- $ref: "../swagger.yaml#/parameters/biblio_id_pp"
|
||||
- name: Body
|
||||
in: body
|
||||
description: A JSON object or the Marc string describing a biblio
|
||||
required: true
|
||||
schema:
|
||||
type:
|
||||
- string
|
||||
- object
|
||||
- $ref: "../swagger.yaml#/parameters/framework_id_header"
|
||||
- $ref: "../swagger.yaml#/parameters/marc_schema_header"
|
||||
- $ref: "../swagger.yaml#/parameters/confirm_not_duplicate_header"
|
||||
|
|
|
@ -1125,7 +1125,7 @@ subtest 'post() tests' => sub {
|
|||
}
|
||||
);
|
||||
|
||||
$t->post_ok("//$userid:$password@/api/v1/biblios" => {'Content-Type' => 'application/marcxml+xml', 'x-framework-id' => $frameworkcode, "x-march-schema" => 'INVALID'})
|
||||
$t->post_ok("//$userid:$password@/api/v1/biblios" => {'Content-Type' => 'application/marcxml+xml', 'x-framework-id' => $frameworkcode, "x-marc-schema" => 'INVALID'})
|
||||
->status_is(400, 'Invalid header x-marc-schema');
|
||||
|
||||
$t->post_ok("//$userid:$password@/api/v1/biblios" => {'Content-Type' => 'application/marcxml+xml', 'x-framework-id' => $frameworkcode} => $marcxml)
|
||||
|
|
Loading…
Reference in a new issue