Bug 22440: ILL API changes
[koha.git] / Koha / REST / V1 / Illbackends.pm
1 package Koha::REST::V1::Illbackends;
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
8 # version.
9 #
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License along
15 # with Koha; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18 use Modern::Perl;
19
20 use Mojo::Base 'Mojolicious::Controller';
21
22 use Koha::Illrequest::Config;
23 use Koha::Illrequests;
24
25 =head1 NAME
26
27 Koha::REST::V1::Illbackends
28
29 =head2 Operations
30
31 =head3 list
32
33 Return a list of available ILL backends and its capabilities
34
35 =cut
36
37 sub list {
38     my $c = shift->openapi->valid_input;
39
40     my $config = Koha::Illrequest::Config->new;
41     my $backends = $config->available_backends;
42
43     my @data;
44     foreach my $b ( @$backends ) {
45         my $backend = Koha::Illrequest->new->load_backend( $b );
46         push @data, {
47             ill_backend_id => $b,
48             capabilities => $backend->capabilities,
49         };
50     }
51     return $c->render( status => 200, openapi => \@data );
52 }
53
54 =head3 list_statuses
55
56 Return a list of existing ILL statuses
57
58 =cut
59
60 sub list_statuses {
61     my $c = shift->openapi->valid_input;
62
63     my $backend_id = $c->validation->param('ill_backend_id');
64
65     #FIXME: Currently fetching all requests, it'd be great if we could fetch distinct(status).
66     # Even doing it with distinct status, we need the ILL request object, so that strings_map works and
67     # the ILL request returns the correct status and info respective to its backend.
68     my $ill_requests = Koha::Illrequests->search(
69             {backend => $backend_id},
70             # {
71             #     columns => [ qw/status/ ],
72             #     group_by => [ qw/status/ ],
73             # }
74         );
75
76     my @data;
77     while (my $request = $ill_requests->next) {
78         my $status_data = $request->strings_map;
79
80         foreach my $status_class ( qw(status_alias status) ){
81             if ($status_data->{$status_class}){
82                 push @data, {
83                     $status_data->{$status_class}->{str} ? (str => $status_data->{$status_class}->{str}) :
84                         $status_data->{$status_class}->{code} ? (str => $status_data->{$status_class}->{code}) : (),
85                     $status_data->{$status_class}->{code} ? (code => $status_data->{$status_class}->{code}) : (),
86                 }
87             }
88         }
89     }
90
91     # Remove duplicate statuses
92     my %seen;
93     @data =  grep { my $e = $_; my $key = join '___', map { $e->{$_}; } sort keys %$_;!$seen{$key}++ } @data;
94
95     return $c->render( status => 200, openapi => \@data );
96 }
97
98 =head3 get
99
100 Get one backend
101
102 =cut
103
104 sub get {
105     my $c = shift->openapi->valid_input;
106
107     my $backend_id = $c->validation->param('ill_backend_id');
108
109     return try {
110         my $backend = Koha::Illrequest->new->load_backend( $backend_id );
111         return $c->render(
112             status => 200,
113             openapi => {
114                 ill_backend_id => $backend_id,
115                 capabilities => $backend->capabilities
116             }
117         );
118     } catch {
119         return $c->render(
120             status => 404,
121             openapi => { error => "ILL backend does not exist" }
122         );
123     };
124 }
125
126 1;