From 5018d37ade4dbc1f6a848ff913d53e19a1d23ffc Mon Sep 17 00:00:00 2001 From: Lari Taskula Date: Mon, 20 Feb 2017 19:58:28 +0200 Subject: [PATCH] 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 --- Koha/REST/V1/Cities.pm | 73 ++++++++++++++++++++++------------------ api/v1/swagger/paths/cities.json | 64 +++++++++++++++++++++++++++++------ t/db_dependent/api/v1/cities.t | 2 +- 3 files changed, 95 insertions(+), 44 deletions(-) diff --git a/Koha/REST/V1/Cities.pm b/Koha/REST/V1/Cities.pm index e8ababe..df30e42 100644 --- a/Koha/REST/V1/Cities.pm +++ b/Koha/REST/V1/Cities.pm @@ -26,108 +26,117 @@ use Koha::Cities; use Try::Tiny; sub list { - my ( $c, $args, $cb ) = @_; + my $c = shift->openapi->valid_input or return; my $cities; my $filter; - $args //= {}; + my $args = $c->req->params->to_hash; for my $filter_param ( keys %$args ) { $filter->{$filter_param} = { LIKE => $args->{$filter_param} . "%" }; } return try { - $cities = Koha::Cities->search($filter)->unblessed; - return $c->$cb( $cities, 200 ); + $cities = Koha::Cities->search($filter); + return $c->render( status => 200, openapi => $cities ); } catch { if ( $_->isa('DBIx::Class::Exception') ) { - return $c->$cb( { error => $_->{msg} }, 500 ); + return $c->render( status => 500, + openapi => { error => $_->msg } ); } else { - return $c->$cb( - { error => "Something went wrong, check the logs." }, 500 ); + return $c->render( status => 500, + openapi => { error => "Something went wrong, check the logs."} ); } }; + } 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) { - return $c->$cb( { error => "City not found" }, 404 ); + return $c->render( status => 404, + openapi => { error => "City not found" } ); } - return $c->$cb( $city->unblessed, 200 ); + return $c->render( status => 200, openapi => $city ); } 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 { $city->store; - return $c->$cb( $city->unblessed, 200 ); + return $c->render( status => 200, openapi => $city ); } catch { if ( $_->isa('DBIx::Class::Exception') ) { - return $c->$cb( { error => $_->msg }, 500 ); + return $c->render( status => 500, + openapi => { error => $_->message } ); } else { - return $c->$cb( - { error => "Something went wrong, check the logs." }, 500 ); + return $c->render( status => 500, + openapi => { error => "Something went wrong, check the logs."} ); } }; } sub update { - my ( $c, $args, $cb ) = @_; + my $c = shift->openapi->valid_input or return; my $city; return try { - $city = Koha::Cities->find( $args->{cityid} ); - $city->set( $args->{body} ); + $city = Koha::Cities->find( $c->validation->param('cityid') ); + my $params = $c->req->json; + $city->set( $params ); $city->store(); - return $c->$cb( $city->unblessed, 200 ); + return $c->render( status => 200, openapi => $city ); } catch { 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') ) { - return $c->$cb( { error => $_->message }, 500 ); + return $c->render( status => 500, + openapi => { error => $_->message } ); } else { - return $c->$cb( - { error => "Something went wrong, check the logs." }, 500 ); + return $c->render( status => 500, + openapi => { error => "Something went wrong, check the logs."} ); } }; } sub delete { - my ( $c, $args, $cb ) = @_; + my $c = shift->openapi->valid_input or return; my $city; return try { - $city = Koha::Cities->find( $args->{cityid} ); + $city = Koha::Cities->find( $c->validation->param('cityid') ); $city->delete; - return $c->$cb( "", 200 ); + return $c->render( status => 200, openapi => "" ); } catch { 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') ) { - return $c->$cb( { error => $_->msg }, 500 ); + return $c->render( status => 500, + openapi => { error => $_->msg } ); } else { - return $c->$cb( - { error => "Something went wrong, check the logs." }, 500 ); + return $c->render( status => 500, + openapi => { error => "Something went wrong, check the logs."} ); } }; diff --git a/api/v1/swagger/paths/cities.json b/api/v1/swagger/paths/cities.json index 650d224..8b739d6 100644 --- a/api/v1/swagger/paths/cities.json +++ b/api/v1/swagger/paths/cities.json @@ -1,7 +1,7 @@ { "/cities": { "get": { - "x-mojo-controller": "Koha::REST::V1::Cities", + "x-mojo-to": "Cities#list", "operationId": "list", "tags": ["cities"], "produces": [ @@ -53,11 +53,17 @@ "schema": { "$ref": "../definitions.json#/error" } + }, + "503": { + "description": "Under maintenance", + "schema": { + "$ref": "../definitions.json#/error" + } } } }, "post": { - "x-mojo-controller": "Koha::REST::V1::Cities", + "x-mojo-to": "Cities#add", "operationId": "add", "tags": ["cities"], "parameters": [{ @@ -79,6 +85,12 @@ "$ref": "../definitions.json#/city" } }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "../definitions.json#/error" + } + }, "403": { "description": "Access forbidden", "schema": { @@ -90,6 +102,12 @@ "schema": { "$ref": "../definitions.json#/error" } + }, + "503": { + "description": "Under maintenance", + "schema": { + "$ref": "../definitions.json#/error" + } } }, "x-koha-authorization": { @@ -101,7 +119,7 @@ }, "/cities/{cityid}": { "get": { - "x-mojo-controller": "Koha::REST::V1::Cities", + "x-mojo-to": "Cities#get", "operationId": "get", "tags": ["cities"], "parameters": [{ @@ -117,12 +135,6 @@ "$ref": "../definitions.json#/city" } }, - "403": { - "description": "Access forbidden", - "schema": { - "$ref": "../definitions.json#/error" - } - }, "404": { "description": "City not found", "schema": { @@ -134,11 +146,17 @@ "schema": { "$ref": "../definitions.json#/error" } + }, + "503": { + "description": "Under maintenance", + "schema": { + "$ref": "../definitions.json#/error" + } } } }, "put": { - "x-mojo-controller": "Koha::REST::V1::Cities", + "x-mojo-to": "Cities#update", "operationId": "update", "tags": ["cities"], "parameters": [{ @@ -162,6 +180,12 @@ "$ref": "../definitions.json#/city" } }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "../definitions.json#/error" + } + }, "403": { "description": "Access forbidden", "schema": { @@ -179,6 +203,12 @@ "schema": { "$ref": "../definitions.json#/error" } + }, + "503": { + "description": "Under maintenance", + "schema": { + "$ref": "../definitions.json#/error" + } } }, "x-koha-authorization": { @@ -188,7 +218,7 @@ } }, "delete": { - "x-mojo-controller": "Koha::REST::V1::Cities", + "x-mojo-to": "Cities#delete", "operationId": "delete", "tags": ["cities"], "parameters": [{ @@ -204,6 +234,12 @@ "type": "string" } }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "../definitions.json#/error" + } + }, "403": { "description": "Access forbidden", "schema": { @@ -221,6 +257,12 @@ "schema": { "$ref": "../definitions.json#/error" } + }, + "503": { + "description": "Under maintenance", + "schema": { + "$ref": "../definitions.json#/error" + } } }, "x-koha-authorization": { diff --git a/t/db_dependent/api/v1/cities.t b/t/db_dependent/api/v1/cities.t index e6e13c6..ac8fe43 100644 --- a/t/db_dependent/api/v1/cities.t +++ b/t/db_dependent/api/v1/cities.t @@ -332,7 +332,7 @@ subtest 'delete() tests' => sub { $tx->req->cookies( { name => 'CGISESSID', value => $authorized_session_id } ); $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->req->cookies( -- 1.9.1