Browse Source

Bug 18137: Make /cities Mojolicious::Plugin::OpenAPI compatible

Also:
- adding some missing and new response definitions into Swagger spec.

To test:
1. prove t/db_dependent/api/v1/cities.t

Signed-off-by: Olli-Antti Kivilahti <olli-antti.kivilahti@jns.fi>

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
17.11.x
Lari Taskula 7 years ago
committed by Jonathan Druart
parent
commit
b007919e35
  1. 71
      Koha/REST/V1/Cities.pm
  2. 64
      api/v1/swagger/paths/cities.json
  3. 2
      t/db_dependent/api/v1/cities.t

71
Koha/REST/V1/Cities.pm

@ -25,11 +25,11 @@ use Koha::Cities;
use Try::Tiny; use Try::Tiny;
sub list { sub list {
my ( $c, $args, $cb ) = @_; my $c = shift->openapi->valid_input or return;
my $cities; my $cities;
my $filter; my $filter;
$args //= {}; my $args = $c->req->params->to_hash;
for my $filter_param ( keys %$args ) { for my $filter_param ( keys %$args ) {
$filter->{$filter_param} = { LIKE => $args->{$filter_param} . "%" }; $filter->{$filter_param} = { LIKE => $args->{$filter_param} . "%" };
@ -37,96 +37,105 @@ sub list {
return try { return try {
$cities = Koha::Cities->search($filter); $cities = Koha::Cities->search($filter);
return $c->$cb( $cities, 200 ); return $c->render( status => 200, openapi => $cities );
} }
catch { catch {
if ( $_->isa('DBIx::Class::Exception') ) { if ( $_->isa('DBIx::Class::Exception') ) {
return $c->$cb( { error => $_->{msg} }, 500 ); return $c->render( status => 500,
openapi => { error => $_->msg } );
} }
else { else {
return $c->$cb( return $c->render( status => 500,
{ error => "Something went wrong, check the logs." }, 500 ); openapi => { error => "Something went wrong, check the logs."} );
} }
}; };
} }
sub get { sub get {
my ( $c, $args, $cb ) = @_; my $c = shift->openapi->valid_input or return;
my $city = Koha::Cities->find( $args->{cityid} ); my $city = Koha::Cities->find( $c->validation->param('cityid') );
unless ($city) { unless ($city) {
return $c->$cb( { error => "City not found" }, 404 ); return $c->render( status => 404,
openapi => { error => "City not found" } );
} }
return $c->$cb( $city, 200 ); return $c->render( status => 200, openapi => $city );
} }
sub add { sub add {
my ( $c, $args, $cb ) = @_; my $c = shift->openapi->valid_input or return;
my $city = Koha::City->new( $args->{body} ); my $city = Koha::City->new( $c->validation->param('body') );
return try { return try {
$city->store; $city->store;
return $c->$cb( $city, 200 ); return $c->render( status => 200, openapi => $city );
} }
catch { catch {
if ( $_->isa('DBIx::Class::Exception') ) { if ( $_->isa('DBIx::Class::Exception') ) {
return $c->$cb( { error => $_->msg }, 500 ); return $c->render( status => 500,
openapi => { error => $_->message } );
} }
else { else {
return $c->$cb( return $c->render( status => 500,
{ error => "Something went wrong, check the logs." }, 500 ); openapi => { error => "Something went wrong, check the logs."} );
} }
}; };
} }
sub update { sub update {
my ( $c, $args, $cb ) = @_; my $c = shift->openapi->valid_input or return;
my $city; my $city;
return try { return try {
$city = Koha::Cities->find( $args->{cityid} ); $city = Koha::Cities->find( $c->validation->param('cityid') );
$city->set( $args->{body} ); my $params = $c->req->json;
$city->set( $params );
$city->store(); $city->store();
return $c->$cb( $city, 200 ); return $c->render( status => 200, openapi => $city );
} }
catch { catch {
if ( not defined $city ) { if ( not defined $city ) {
return $c->$cb( { error => "Object not found" }, 404 ); return $c->render( status => 404,
openapi => { error => "Object not found" } );
} }
elsif ( $_->isa('Koha::Exceptions::Object') ) { elsif ( $_->isa('Koha::Exceptions::Object') ) {
return $c->$cb( { error => $_->message }, 500 ); return $c->render( status => 500,
openapi => { error => $_->message } );
} }
else { else {
return $c->$cb( return $c->render( status => 500,
{ error => "Something went wrong, check the logs." }, 500 ); openapi => { error => "Something went wrong, check the logs."} );
} }
}; };
} }
sub delete { sub delete {
my ( $c, $args, $cb ) = @_; my $c = shift->openapi->valid_input or return;
my $city; my $city;
return try { return try {
$city = Koha::Cities->find( $args->{cityid} ); $city = Koha::Cities->find( $c->validation->param('cityid') );
$city->delete; $city->delete;
return $c->$cb( "", 200 ); return $c->render( status => 200, openapi => "" );
} }
catch { catch {
if ( not defined $city ) { if ( not defined $city ) {
return $c->$cb( { error => "Object not found" }, 404 ); return $c->render( status => 404,
openapi => { error => "Object not found" } );
} }
elsif ( $_->isa('DBIx::Class::Exception') ) { elsif ( $_->isa('DBIx::Class::Exception') ) {
return $c->$cb( { error => $_->msg }, 500 ); return $c->render( status => 500,
openapi => { error => $_->msg } );
} }
else { else {
return $c->$cb( return $c->render( status => 500,
{ error => "Something went wrong, check the logs." }, 500 ); openapi => { error => "Something went wrong, check the logs."} );
} }
}; };

64
api/v1/swagger/paths/cities.json

@ -1,7 +1,7 @@
{ {
"/cities": { "/cities": {
"get": { "get": {
"x-mojo-controller": "Koha::REST::V1::Cities", "x-mojo-to": "Cities#list",
"operationId": "list", "operationId": "list",
"tags": ["cities"], "tags": ["cities"],
"produces": [ "produces": [
@ -53,11 +53,17 @@
"schema": { "schema": {
"$ref": "../definitions.json#/error" "$ref": "../definitions.json#/error"
} }
},
"503": {
"description": "Under maintenance",
"schema": {
"$ref": "../definitions.json#/error"
}
} }
} }
}, },
"post": { "post": {
"x-mojo-controller": "Koha::REST::V1::Cities", "x-mojo-to": "Cities#add",
"operationId": "add", "operationId": "add",
"tags": ["cities"], "tags": ["cities"],
"parameters": [{ "parameters": [{
@ -79,6 +85,12 @@
"$ref": "../definitions.json#/city" "$ref": "../definitions.json#/city"
} }
}, },
"401": {
"description": "Authentication required",
"schema": {
"$ref": "../definitions.json#/error"
}
},
"403": { "403": {
"description": "Access forbidden", "description": "Access forbidden",
"schema": { "schema": {
@ -90,6 +102,12 @@
"schema": { "schema": {
"$ref": "../definitions.json#/error" "$ref": "../definitions.json#/error"
} }
},
"503": {
"description": "Under maintenance",
"schema": {
"$ref": "../definitions.json#/error"
}
} }
}, },
"x-koha-authorization": { "x-koha-authorization": {
@ -101,7 +119,7 @@
}, },
"/cities/{cityid}": { "/cities/{cityid}": {
"get": { "get": {
"x-mojo-controller": "Koha::REST::V1::Cities", "x-mojo-to": "Cities#get",
"operationId": "get", "operationId": "get",
"tags": ["cities"], "tags": ["cities"],
"parameters": [{ "parameters": [{
@ -117,12 +135,6 @@
"$ref": "../definitions.json#/city" "$ref": "../definitions.json#/city"
} }
}, },
"403": {
"description": "Access forbidden",
"schema": {
"$ref": "../definitions.json#/error"
}
},
"404": { "404": {
"description": "City not found", "description": "City not found",
"schema": { "schema": {
@ -134,11 +146,17 @@
"schema": { "schema": {
"$ref": "../definitions.json#/error" "$ref": "../definitions.json#/error"
} }
},
"503": {
"description": "Under maintenance",
"schema": {
"$ref": "../definitions.json#/error"
}
} }
} }
}, },
"put": { "put": {
"x-mojo-controller": "Koha::REST::V1::Cities", "x-mojo-to": "Cities#update",
"operationId": "update", "operationId": "update",
"tags": ["cities"], "tags": ["cities"],
"parameters": [{ "parameters": [{
@ -162,6 +180,12 @@
"$ref": "../definitions.json#/city" "$ref": "../definitions.json#/city"
} }
}, },
"401": {
"description": "Authentication required",
"schema": {
"$ref": "../definitions.json#/error"
}
},
"403": { "403": {
"description": "Access forbidden", "description": "Access forbidden",
"schema": { "schema": {
@ -179,6 +203,12 @@
"schema": { "schema": {
"$ref": "../definitions.json#/error" "$ref": "../definitions.json#/error"
} }
},
"503": {
"description": "Under maintenance",
"schema": {
"$ref": "../definitions.json#/error"
}
} }
}, },
"x-koha-authorization": { "x-koha-authorization": {
@ -188,7 +218,7 @@
} }
}, },
"delete": { "delete": {
"x-mojo-controller": "Koha::REST::V1::Cities", "x-mojo-to": "Cities#delete",
"operationId": "delete", "operationId": "delete",
"tags": ["cities"], "tags": ["cities"],
"parameters": [{ "parameters": [{
@ -204,6 +234,12 @@
"type": "string" "type": "string"
} }
}, },
"401": {
"description": "Authentication required",
"schema": {
"$ref": "../definitions.json#/error"
}
},
"403": { "403": {
"description": "Access forbidden", "description": "Access forbidden",
"schema": { "schema": {
@ -221,6 +257,12 @@
"schema": { "schema": {
"$ref": "../definitions.json#/error" "$ref": "../definitions.json#/error"
} }
},
"503": {
"description": "Under maintenance",
"schema": {
"$ref": "../definitions.json#/error"
}
} }
}, },
"x-koha-authorization": { "x-koha-authorization": {

2
t/db_dependent/api/v1/cities.t

@ -332,7 +332,7 @@ subtest 'delete() tests' => sub {
$tx->req->cookies( $tx->req->cookies(
{ name => 'CGISESSID', value => $authorized_session_id } ); { name => 'CGISESSID', value => $authorized_session_id } );
$tx->req->env( { REMOTE_ADDR => $remote_address } ); $tx->req->env( { REMOTE_ADDR => $remote_address } );
$t->request_ok($tx)->status_is(200)->content_is(''); $t->request_ok($tx)->status_is(200)->content_is('""');
$tx = $t->ua->build_tx( DELETE => "/api/v1/cities/$city_id" ); $tx = $t->ua->build_tx( DELETE => "/api/v1/cities/$city_id" );
$tx->req->cookies( $tx->req->cookies(

Loading…
Cancel
Save