View | Details | Raw Unified | Return to bug 14962
Collapse All | Expand All

(-)a/Koha/REST/V1/DisplayItems.pm (+261 lines)
Line 0 Link Here
1
package Koha::REST::V1::DisplayItems;
2
3
# Copyright 2025-2026 Open Fifth Ltd
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <https://www.gnu.org/licenses>.
19
20
use Modern::Perl;
21
22
use Mojo::Base 'Mojolicious::Controller';
23
24
use Koha::DisplayItem;
25
use Koha::DisplayItems;
26
use Koha::Displays;
27
28
use Try::Tiny    qw( catch try );
29
use Scalar::Util qw( blessed );
30
31
use Koha::BackgroundJob::BatchAddDisplayItems;
32
use Koha::BackgroundJob::BatchDeleteDisplayItems;
33
34
=head1 API
35
36
=head2 Methods
37
38
=head3 list
39
40
=cut
41
42
sub list {
43
    my $c = shift->openapi->valid_input or return;
44
45
    return try {
46
        my $displayitems = $c->objects->search( Koha::DisplayItems->new );
47
        return $c->render( status => 200, openapi => $displayitems );
48
    } catch {
49
        $c->unhandled_exception($_);
50
    };
51
52
}
53
54
=head3 get
55
56
=cut
57
58
sub get {
59
    my $c = shift->openapi->valid_input or return;
60
61
    return try {
62
        my $displayitem = Koha::DisplayItems->find(
63
            {
64
                display_item_id => $c->param('display_item_id'),
65
                display_id      => $c->param('display_id'),
66
                itemnumber      => $c->param('item_id')
67
            }
68
        );
69
        return $c->render_resource_not_found("Display item")
70
            unless $displayitem;
71
72
        return $c->render( status => 200, openapi => $c->objects->to_api($displayitem), );
73
    } catch {
74
        $c->unhandled_exception($_);
75
    };
76
}
77
78
=head3 add
79
80
=cut
81
82
sub add {
83
    my $c = shift->openapi->valid_input or return;
84
85
    return try {
86
        my $displayitem = Koha::DisplayItem->new_from_api( $c->req->json );
87
        $displayitem->store;
88
        $c->res->headers->location(
89
            $c->req->url->to_string . '/' . $displayitem->display_id . '/' . $displayitem->itemnumber );
90
        return $c->render(
91
            status  => 201,
92
            openapi => $c->objects->to_api($displayitem),
93
        );
94
    } catch {
95
        $c->unhandled_exception($_);
96
    };
97
}
98
99
=head3 update
100
101
=cut
102
103
sub update {
104
    my $c = shift->openapi->valid_input or return;
105
106
    my $displayitem = Koha::DisplayItems->find(
107
        {
108
            display_item_id => $c->param('display_item_id'),
109
            display_id      => $c->param('display_id'),
110
            itemnumber      => $c->param('item_id')
111
        }
112
    );
113
114
    return $c->render_resource_not_found("Display item")
115
        unless $displayitem;
116
117
    return try {
118
        $displayitem->set_from_api( $c->req->json );
119
        $displayitem->store();
120
        return $c->render( status => 200, openapi => $c->objects->to_api($displayitem), );
121
    } catch {
122
        $c->unhandled_exception($_);
123
    };
124
}
125
126
=head3 delete
127
128
=cut
129
130
sub delete {
131
    my $c = shift->openapi->valid_input or return;
132
133
    my $displayitem = Koha::DisplayItems->find(
134
        {
135
            display_item_id => $c->param('display_item_id'),
136
            display_id      => $c->param('display_id'),
137
            itemnumber      => $c->param('item_id')
138
        }
139
    );
140
141
    return $c->render_resource_not_found("Display item")
142
        unless $displayitem;
143
144
    return try {
145
        $displayitem->delete;
146
        return $c->render_resource_deleted;
147
    } catch {
148
        $c->unhandled_exception($_);
149
    };
150
}
151
152
=head3 list_public
153
154
=cut
155
156
sub list_public {
157
    my $c = shift->openapi->valid_input or return;
158
159
    return try {
160
        my $displayitems = $c->objects->search( Koha::DisplayItems->new );
161
        return $c->render( status => 200, openapi => $displayitems );
162
    } catch {
163
        $c->unhandled_exception($_);
164
    };
165
}
166
167
=head3 get_public
168
169
=cut
170
171
sub get_public {
172
    my $c = shift->openapi->valid_input or return;
173
174
    return try {
175
        my $displayitem = Koha::DisplayItems->find(
176
            {
177
                display_item_id => $c->param('display_item_id'),
178
                display_id      => $c->param('display_id'),
179
                itemnumber      => $c->param('item_id')
180
            }
181
        );
182
        return $c->render_resource_not_found("Display item")
183
            unless $displayitem;
184
185
        return $c->render( status => 200, openapi => $c->objects->to_api($displayitem), );
186
    } catch {
187
        $c->unhandled_exception($_);
188
    };
189
}
190
191
=head3 batch_add
192
193
Add multiple items to a display
194
195
=cut
196
197
sub batch_add {
198
    my $c = shift->openapi->valid_input or return;
199
200
    return try {
201
        my $body = $c->req->json;
202
203
        # Validate that display exists
204
        my $display = Koha::Displays->find( $body->{display_id} );
205
        return $c->render_resource_not_found("Display")
206
            unless $display;
207
208
        # Enqueue background job for batch processing
209
        my $job_id = Koha::BackgroundJob::BatchAddDisplayItems->new->enqueue(
210
            {
211
                barcodes    => $body->{barcodes},
212
                date_remove => $body->{date_remove} // undef,
213
                display_id  => $body->{display_id},
214
            }
215
        );
216
217
        return $c->render(
218
            status  => 202,
219
            openapi => {
220
                job_id  => $job_id,
221
                message => "Batch add operation queued"
222
            }
223
        );
224
    } catch {
225
        $c->unhandled_exception($_);
226
    };
227
}
228
229
=head3 batch_delete
230
231
Remove multiple items from displays
232
233
=cut
234
235
sub batch_delete {
236
    my $c = shift->openapi->valid_input or return;
237
238
    return try {
239
        my $body = $c->req->json;
240
241
        # Enqueue background job for batch processing
242
        my $job_id = Koha::BackgroundJob::BatchDeleteDisplayItems->new->enqueue(
243
            {
244
                barcodes   => $body->{barcodes},
245
                display_id => $body->{display_id} // undef,
246
            }
247
        );
248
249
        return $c->render(
250
            status  => 202,
251
            openapi => {
252
                job_id  => $job_id,
253
                message => "Batch delete operation queued"
254
            }
255
        );
256
    } catch {
257
        $c->unhandled_exception($_);
258
    };
259
}
260
261
1;
(-)a/Koha/REST/V1/Displays.pm (+252 lines)
Line 0 Link Here
1
package Koha::REST::V1::Displays;
2
3
# Copyright 2025-2026 Open Fifth Ltd
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <https://www.gnu.org/licenses>.
19
20
use Modern::Perl;
21
22
use Mojo::Base 'Mojolicious::Controller';
23
24
use Koha::Display;
25
use Koha::Displays;
26
use Koha::DateUtils qw( dt_from_string );
27
28
use Try::Tiny qw( catch try );
29
30
=head1 API
31
32
=head2 Methods
33
34
=head3 config
35
36
Return the configuration options needed for the Display Vue app
37
38
=cut
39
40
sub config {
41
    my $c = shift->openapi->valid_input or return;
42
43
    my $patron = $c->stash('koha.user');
44
45
    return $c->render(
46
        status  => 200,
47
        openapi => {
48
            settings => {
49
                enabled => C4::Context->preference('UseDisplayModule'),
50
            },
51
        },
52
    );
53
}
54
55
=head3 list
56
57
=cut
58
59
sub list {
60
    my $c = shift->openapi->valid_input or return;
61
62
    return try {
63
        my $displays_set = Koha::Displays->new;
64
65
        my $active = $c->param('active');
66
        if ( defined $active && $active ) {
67
            $displays_set = $displays_set->active;
68
        }
69
70
        # Filter displays based on user's library permissions
71
        my $patron = $c->stash('koha.user');
72
        if ($patron) {
73
            my @restricted_branchcodes = $patron->libraries_where_can_edit_displays;
74
            if (@restricted_branchcodes) {
75
76
                # User can only see displays from specific libraries
77
                $displays_set = $displays_set->search( { 'me.display_branch' => { -in => \@restricted_branchcodes } } );
78
            }
79
80
            # If @restricted_branchcodes is empty, user has access to all displays
81
        }
82
83
        my $displays = $c->objects->search($displays_set);
84
        return $c->render( status => 200, openapi => $displays );
85
    } catch {
86
        $c->unhandled_exception($_);
87
    };
88
89
}
90
91
=head3 get
92
93
=cut
94
95
sub get {
96
    my $c = shift->openapi->valid_input or return;
97
98
    return try {
99
        my $display = Koha::Displays->find( $c->param('display_id') );
100
        return $c->render_resource_not_found("Display")
101
            unless $display;
102
103
        # Check if user has permission to view this display
104
        my $patron = $c->stash('koha.user');
105
        if ($patron) {
106
            my @restricted_branchcodes = $patron->libraries_where_can_edit_displays;
107
            if (@restricted_branchcodes) {
108
109
                # User can only see displays from specific libraries
110
                unless ( grep { $_ eq $display->display_branch } @restricted_branchcodes ) {
111
                    return $c->render_resource_not_found("Display");
112
                }
113
            }
114
115
            # If @restricted_branchcodes is empty, user has access to all displays
116
        }
117
118
        return $c->render( status => 200, openapi => $c->objects->to_api($display), );
119
    } catch {
120
        $c->unhandled_exception($_);
121
    };
122
}
123
124
=head3 add
125
126
=cut
127
128
sub add {
129
    my $c = shift->openapi->valid_input or return;
130
131
    return try {
132
        my $body = $c->req->json;
133
134
        my $display_items = delete $body->{display_items} || [];
135
136
        my $display = Koha::Display->new_from_api($body)->store;
137
        $display->display_items($display_items);
138
139
        $c->res->headers->location( $c->req->url->to_string . '/' . $display->display_id );
140
        return $c->render(
141
            status  => 201,
142
            openapi => $c->objects->to_api($display),
143
        );
144
    } catch {
145
        $c->unhandled_exception($_);
146
    };
147
}
148
149
=head3 update
150
151
=cut
152
153
sub update {
154
    my $c = shift->openapi->valid_input or return;
155
156
    my $display = Koha::Displays->find( $c->param('display_id') );
157
158
    return $c->render_resource_not_found("Display")
159
        unless $display;
160
161
    return try {
162
        my $body = $c->req->json;
163
164
        my $display_items = delete $body->{display_items} || [];
165
166
        $display->set_from_api($body)->store;
167
        $display->display_items($display_items);
168
169
        return $c->render( status => 200, openapi => $c->objects->to_api($display), );
170
    } catch {
171
        $c->unhandled_exception($_);
172
    };
173
}
174
175
=head3 delete
176
177
=cut
178
179
sub delete {
180
    my $c = shift->openapi->valid_input or return;
181
182
    my $display = Koha::Displays->find( $c->param('display_id') );
183
184
    return $c->render_resource_not_found("Display")
185
        unless $display;
186
187
    return try {
188
        $display->delete;
189
        return $c->render_resource_deleted;
190
    } catch {
191
        $c->unhandled_exception($_);
192
    };
193
}
194
195
=head3 list_public
196
197
=cut
198
199
sub list_public {
200
    my $c = shift->openapi->valid_input or return;
201
202
    return try {
203
        my $displays_set = Koha::Displays->new;
204
205
        my $active = $c->param('active');
206
        if ( defined $active && $active ) {
207
            $displays_set = $displays_set->active;
208
        } else {
209
            my $today = dt_from_string->truncate( to => 'day' );
210
            $displays_set = $displays_set->search(
211
                {
212
                    -or => [
213
                        { end_date => { '>=' => $today } },
214
                        { end_date => undef }
215
                    ]
216
                }
217
            );
218
        }
219
220
        my $displays = $c->objects->search($displays_set);
221
        return $c->render( status => 200, openapi => $displays );
222
    } catch {
223
        $c->unhandled_exception($_);
224
    };
225
}
226
227
=head3 get_public
228
229
=cut
230
231
sub get_public {
232
    my $c = shift->openapi->valid_input or return;
233
234
    return try {
235
        my $display = Koha::Displays->find( $c->param('display_id') );
236
237
        return $c->render_resource_not_found("Display")
238
            unless $display;
239
240
        my $today = dt_from_string->truncate( to => 'day' )->ymd;
241
242
        if ( $display->end_date && $display->end_date < $today ) {
243
            return $c->render_resource_not_found("Display");
244
        }
245
246
        return $c->render( status => 200, openapi => $c->objects->to_api($display), );
247
    } catch {
248
        $c->unhandled_exception($_);
249
    };
250
}
251
252
1;
(-)a/api/v1/swagger/definitions/display.yaml (+102 lines)
Line 0 Link Here
1
---
2
type: object
3
properties:
4
  display_id:
5
    type: integer
6
    description: internally assigned display identifier
7
    readOnly: true
8
  display_name:
9
    description: display name
10
    type: string
11
  start_date:
12
    description: display start date
13
    type:
14
      - string
15
      - "null"
16
    format: date
17
  end_date:
18
    description: display end date
19
    type:
20
      - string
21
      - "null"
22
    format: date
23
  enabled:
24
    description: determines whether the display is active
25
    type: boolean
26
  display_location:
27
    description: shelving location for the display
28
    type:
29
      - string
30
      - "null"
31
  display_code:
32
    description: collection code for the display
33
    type:
34
      - string
35
      - "null"
36
  display_branch:
37
    description: home branch for items while on display
38
    type:
39
      - string
40
      - "null"
41
  display_holding_branch:
42
    description: holding branch for items while on display
43
    type:
44
      - string
45
      - "null"
46
  display_itype:
47
    description: item type for items while on display
48
    type:
49
      - string
50
      - "null"
51
  staff_note:
52
    description: staff note for the display
53
    type:
54
      - string
55
      - "null"
56
  public_note:
57
    description: public note for the display
58
    type:
59
      - string
60
      - "null"
61
  display_days:
62
    description: default number of days items will remain on display
63
    type:
64
      - integer
65
      - "null"
66
  display_return_over:
67
    description: should the item be removed from the display when it is returned
68
    type: string
69
    enum:
70
      - "yes - any library"
71
      - "yes - except at home library"
72
      - "no"
73
    default: "no"
74
  display_items:
75
    type:
76
      - array
77
      - "null"
78
    description: The object representing the display items
79
  home_library:
80
    type:
81
      - object
82
      - "null"
83
    description: The object representing the display's home library
84
  holding_library:
85
    type:
86
      - object
87
      - "null"
88
    description: The object representing the display's holding library
89
  item_type:
90
    type:
91
      - object
92
      - "null"
93
    description: The object representing the display item type
94
  _strings:
95
    type:
96
      - object
97
      - "null"
98
additionalProperties: false
99
required:
100
  - display_name
101
  - enabled
102
  - display_return_over 
(-)a/api/v1/swagger/definitions/display_config.yaml (+7 lines)
Line 0 Link Here
1
---
2
type: object
3
properties:
4
  settings:
5
    type: object
6
    description: List of sysprefs used for the Displays module
7
additionalProperties: false
(-)a/api/v1/swagger/definitions/displayitem.yaml (+31 lines)
Line 0 Link Here
1
---
2
type: object
3
properties:
4
  display_item_id:
5
    type: integer
6
    description: primary key
7
  display_id:
8
    type: integer
9
    description: foreign key to link to displays.display_id
10
  itemnumber:
11
    type: integer
12
    description: items.itemnumber for the item on display
13
  biblionumber:
14
    type: integer
15
    description: biblio.biblionumber for the bibliographic record on display
16
  date_added:
17
    description: the date the item was added to the display
18
    type:
19
      - string
20
      - "null"
21
    format: date
22
  date_remove:
23
    description: the date the item should be removed from the display
24
    type:
25
      - string
26
      - "null"
27
    format: date
28
additionalProperties: false
29
required:
30
  - display_id
31
  - itemnumber
(-)a/api/v1/swagger/definitions/item.yaml (+33 lines)
Lines 32-37 properties: Link Here
32
  effective_bookable:
32
  effective_bookable:
33
    type: boolean
33
    type: boolean
34
    description: Allow bookings on this item.
34
    description: Allow bookings on this item.
35
  effective_home_library_id:
36
    type:
37
      - string
38
      - "null"
39
    description: Effective home library id - shows display branch if item is on an active display, otherwise regular home branch
40
    maxLength: 10
41
  effective_holding_library_id:
42
    type:
43
      - string
44
      - "null"
45
    description: Effective holding library id - shows display holding branch if item is on an active display, otherwise regular holding branch
46
    maxLength: 10
35
  home_library_id:
47
  home_library_id:
36
    type:
48
    type:
37
      - string
49
      - string
Lines 197-202 properties: Link Here
197
      - "null"
209
      - "null"
198
    description: Authorized value for the collection code associated with this item
210
    description: Authorized value for the collection code associated with this item
199
    maxLength: 80
211
    maxLength: 80
212
  effective_collection_code:
213
    type:
214
      - string
215
      - "null"
216
    description: Effective collection code - shows display collection code if item is on an active display, otherwise regular collection code
217
    maxLength: 80
200
  materials_notes:
218
  materials_notes:
201
    type:
219
    type:
202
      - string
220
      - string
Lines 223-228 properties: Link Here
223
      - string
241
      - string
224
      - "null"
242
      - "null"
225
    description: Effective itemtype defining the type for this item_id
243
    description: Effective itemtype defining the type for this item_id
244
    maxLength: 10
245
  effective_location:
246
    type:
247
      - string
248
      - "null"
249
    description: Effective location code - shows display location if item is on an active display, otherwise regular location
250
    maxLength: 80
226
  extended_subfields:
251
  extended_subfields:
227
    type:
252
    type:
228
      - string
253
      - string
Lines 261-266 properties: Link Here
261
    type:
286
    type:
262
      - object
287
      - object
263
      - "null"
288
      - "null"
289
  effective_home_library:
290
    type:
291
      - object
292
      - "null"
293
  effective_holding_library:
294
    type:
295
      - object
296
      - "null"
264
  home_library:
297
  home_library:
265
    type:
298
    type:
266
      - object
299
      - object
(-)a/api/v1/swagger/paths/biblios.yaml (+2 lines)
Lines 459-464 Link Here
459
          enum:
459
          enum:
460
            - +strings
460
            - +strings
461
            - _status
461
            - _status
462
            - effective_home_library
463
            - effective_holding_library
462
            - home_library
464
            - home_library
463
            - holding_library
465
            - holding_library
464
            - biblio.title
466
            - biblio.title
(-)a/api/v1/swagger/paths/displayitems.yaml (+395 lines)
Line 0 Link Here
1
---
2
/display/items:
3
  get:
4
    x-mojo-to: DisplayItems#list
5
    operationId: listDisplayItems
6
    tags:
7
      - displayitems
8
    summary: List display items
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: display_item_id
13
        in: query
14
        description: Filter by display item ID
15
        required: false
16
        type: integer
17
      - name: display_id
18
        in: query
19
        description: Filter by display ID
20
        required: false
21
        type: integer
22
      - name: itemnumber
23
        in: query
24
        description: Filter by item number
25
        required: false
26
        type: integer
27
      - name: biblionumber
28
        in: query
29
        description: Filter by bibliographic record number
30
        required: false
31
        type: integer
32
      - name: date_added
33
        in: query
34
        description: Filter by date added
35
        required: false
36
        type: string
37
        format: date
38
      - name: date_remove
39
        in: query
40
        description: Filter by date to remove
41
        required: false
42
        type: string
43
        format: date
44
      - $ref: "../swagger.yaml#/parameters/match"
45
      - $ref: "../swagger.yaml#/parameters/order_by"
46
      - $ref: "../swagger.yaml#/parameters/page"
47
      - $ref: "../swagger.yaml#/parameters/per_page"
48
      - $ref: "../swagger.yaml#/parameters/q_param"
49
      - $ref: "../swagger.yaml#/parameters/q_body"
50
      - $ref: "../swagger.yaml#/parameters/request_id_header"
51
    responses:
52
      "200":
53
        description: A list of display items
54
        schema:
55
          type: array
56
          items:
57
            $ref: "../swagger.yaml#/definitions/displayitem"
58
      "400":
59
        description: |
60
          Bad request. Possible `error_code` attribute values:
61
62
            * `invalid_query`
63
        schema:
64
          $ref: "../swagger.yaml#/definitions/error"
65
      "403":
66
        description: Access forbidden
67
        schema:
68
          $ref: "../swagger.yaml#/definitions/error"
69
      "500":
70
        description: |
71
          Internal server error. Possible `error_code` attribute values:
72
73
          * `internal_server_error`
74
        schema:
75
          $ref: "../swagger.yaml#/definitions/error"
76
      "503":
77
        description: Under maintenance
78
        schema:
79
          $ref: "../swagger.yaml#/definitions/error"
80
    x-koha-authorization:
81
      permissions:
82
        displays: "*"
83
  post:
84
    x-mojo-to: DisplayItems#add
85
    operationId: addDisplayItem
86
    tags:
87
      - displayitems
88
    summary: Add display item
89
    parameters:
90
      - name: body
91
        in: body
92
        description: A JSON object containing information about the new display item
93
        required: true
94
        schema:
95
          $ref: "../swagger.yaml#/definitions/displayitem"
96
    produces:
97
      - application/json
98
    responses:
99
      "201":
100
        description: Display item added
101
        schema:
102
          $ref: "../swagger.yaml#/definitions/displayitem"
103
      "400":
104
        description: Bad request
105
        schema:
106
          $ref: "../swagger.yaml#/definitions/error"
107
      "401":
108
        description: Authentication required
109
        schema:
110
          $ref: "../swagger.yaml#/definitions/error"
111
      "403":
112
        description: Access forbidden
113
        schema:
114
          $ref: "../swagger.yaml#/definitions/error"
115
      "500":
116
        description: |
117
          Internal server error. Possible `error_code` attribute values:
118
119
          * `internal_server_error`
120
        schema:
121
          $ref: "../swagger.yaml#/definitions/error"
122
      "503":
123
        description: Under maintenance
124
        schema:
125
          $ref: "../swagger.yaml#/definitions/error"
126
    x-koha-authorization:
127
      permissions:
128
        displays: add_items_to_display
129
"/display/items/{display_id}/{item_id}":
130
  get:
131
    x-mojo-to: DisplayItems#get
132
    operationId: getDisplayItem
133
    tags:
134
      - displayitems
135
    summary: Get display item
136
    parameters:
137
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
138
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
139
    produces:
140
      - application/json
141
    responses:
142
      "200":
143
        description: A display item
144
        schema:
145
          $ref: "../swagger.yaml#/definitions/displayitem"
146
      "400":
147
        description: Bad request
148
        schema:
149
          $ref: "../swagger.yaml#/definitions/error"
150
      "404":
151
        description: Display item not found
152
        schema:
153
          $ref: "../swagger.yaml#/definitions/error"
154
      "500":
155
        description: |
156
          Internal server error. Possible `error_code` attribute values:
157
158
          * `internal_server_error`
159
        schema:
160
          $ref: "../swagger.yaml#/definitions/error"
161
      "503":
162
        description: Under maintenance
163
        schema:
164
          $ref: "../swagger.yaml#/definitions/error"
165
    x-koha-authorization:
166
      permissions:
167
        displays: "*"
168
  put:
169
    x-mojo-to: DisplayItems#update
170
    operationId: updateDisplayItem
171
    tags:
172
      - displayitems
173
    summary: Update display item
174
    parameters:
175
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
176
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
177
      - name: body
178
        in: body
179
        description: A display item object
180
        required: true
181
        schema:
182
          $ref: "../swagger.yaml#/definitions/displayitem"
183
    produces:
184
      - application/json
185
    responses:
186
      "200":
187
        description: A display item
188
        schema:
189
          $ref: "../swagger.yaml#/definitions/displayitem"
190
      "400":
191
        description: Bad request
192
        schema:
193
          $ref: "../swagger.yaml#/definitions/error"
194
      "401":
195
        description: Authentication required
196
        schema:
197
          $ref: "../swagger.yaml#/definitions/error"
198
      "403":
199
        description: Access forbidden
200
        schema:
201
          $ref: "../swagger.yaml#/definitions/error"
202
      "404":
203
        description: Display item not found
204
        schema:
205
          $ref: "../swagger.yaml#/definitions/error"
206
      "500":
207
        description: Internal error
208
        schema:
209
          $ref: "../swagger.yaml#/definitions/error"
210
      "503":
211
        description: Under maintenance
212
        schema:
213
          $ref: "../swagger.yaml#/definitions/error"
214
    x-koha-authorization:
215
      permissions:
216
        displays: add_items_to_display
217
  delete:
218
    x-mojo-to: DisplayItems#delete
219
    operationId: deleteDisplayItem
220
    tags:
221
      - displayitems
222
    summary: Delete display item
223
    parameters:
224
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
225
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
226
    produces:
227
      - application/json
228
    responses:
229
      "204":
230
        description: Display item deleted
231
      "400":
232
        description: Bad request
233
        schema:
234
          $ref: "../swagger.yaml#/definitions/error"
235
      "401":
236
        description: Authentication required
237
        schema:
238
          $ref: "../swagger.yaml#/definitions/error"
239
      "403":
240
        description: Access forbidden
241
        schema:
242
          $ref: "../swagger.yaml#/definitions/error"
243
      "404":
244
        description: Display item not found
245
        schema:
246
          $ref: "../swagger.yaml#/definitions/error"
247
      "500":
248
        description: Internal error
249
        schema:
250
          $ref: "../swagger.yaml#/definitions/error"
251
      "503":
252
        description: Under maintenance
253
        schema:
254
          $ref: "../swagger.yaml#/definitions/error"
255
    x-koha-authorization:
256
      permissions:
257
        displays: remove_items_from_display
258
/display/items/batch:
259
  post:
260
    x-mojo-to: DisplayItems#batch_add
261
    operationId: batchAddDisplayItems
262
    tags:
263
      - displayitems
264
    summary: Add multiple items to a display
265
    parameters:
266
      - name: body
267
        in: body
268
        description: A JSON object containing display and item information
269
        required: true
270
        schema:
271
          type: object
272
          properties:
273
            display_id:
274
              description: ID of the display to add items to
275
              type: integer
276
            barcodes:
277
              description: Array of item barcodes to add to the display
278
              type: array
279
              items:
280
                type: integer
281
              minItems: 1
282
            date_remove:
283
              description: Optional date when items should be removed from display
284
              type: string
285
              format: date
286
          required:
287
            - display_id
288
            - barcodes
289
          additionalProperties: false
290
    produces:
291
      - application/json
292
    responses:
293
      "202":
294
        description: Batch operation queued
295
        schema:
296
          type: object
297
          properties:
298
            job_id:
299
              type: integer
300
              description: ID of the background job processing this request
301
            message:
302
              type: string
303
              description: Confirmation message
304
          additionalProperties: false
305
      "400":
306
        description: Bad request
307
        schema:
308
          $ref: "../swagger.yaml#/definitions/error"
309
      "401":
310
        description: Authentication required
311
        schema:
312
          $ref: "../swagger.yaml#/definitions/error"
313
      "403":
314
        description: Access forbidden
315
        schema:
316
          $ref: "../swagger.yaml#/definitions/error"
317
      "404":
318
        description: Display not found
319
        schema:
320
          $ref: "../swagger.yaml#/definitions/error"
321
      "500":
322
        description: Internal server error
323
        schema:
324
          $ref: "../swagger.yaml#/definitions/error"
325
      "503":
326
        description: Under maintenance
327
        schema:
328
          $ref: "../swagger.yaml#/definitions/error"
329
    x-koha-authorization:
330
      permissions:
331
        displays: add_items_to_display
332
  delete:
333
    x-mojo-to: DisplayItems#batch_delete
334
    operationId: batchDeleteDisplayItems
335
    tags:
336
      - displayitems
337
    summary: Remove multiple items from displays
338
    parameters:
339
      - name: body
340
        in: body
341
        description: A JSON object containing item information
342
        required: true
343
        schema:
344
          type: object
345
          properties:
346
            barcodes:
347
              description: Array of item barcodes to remove from displays
348
              type: array
349
              items:
350
                type: integer
351
              minItems: 1
352
            display_id:
353
              description: Optional display ID - if specified, only remove items from this display
354
              type: integer
355
          required:
356
            - barcodes
357
          additionalProperties: false
358
    produces:
359
      - application/json
360
    responses:
361
      "202":
362
        description: Batch operation queued
363
        schema:
364
          type: object
365
          properties:
366
            job_id:
367
              type: integer
368
              description: ID of the background job processing this request
369
            message:
370
              type: string
371
              description: Confirmation message
372
          additionalProperties: false
373
      "400":
374
        description: Bad request
375
        schema:
376
          $ref: "../swagger.yaml#/definitions/error"
377
      "401":
378
        description: Authentication required
379
        schema:
380
          $ref: "../swagger.yaml#/definitions/error"
381
      "403":
382
        description: Access forbidden
383
        schema:
384
          $ref: "../swagger.yaml#/definitions/error"
385
      "500":
386
        description: Internal server error
387
        schema:
388
          $ref: "../swagger.yaml#/definitions/error"
389
      "503":
390
        description: Under maintenance
391
        schema:
392
          $ref: "../swagger.yaml#/definitions/error"
393
    x-koha-authorization:
394
      permissions:
395
        displays: remove_items_from_display
(-)a/api/v1/swagger/paths/displays.yaml (+275 lines)
Line 0 Link Here
1
---
2
/displays:
3
  get:
4
    x-mojo-to: Displays#list
5
    operationId: listDisplays
6
    tags:
7
      - displays
8
    summary: List displays
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: display_name
13
        in: query
14
        description: Case insensitive search on display name
15
        required: false
16
        type: string
17
      - name: enabled
18
        in: query
19
        description: Filter by enabled status
20
        required: false
21
        type: boolean
22
      - name: active
23
        in: query
24
        description: Filter by active status (not expired, end_date >= today or null)
25
        required: false
26
        type: boolean
27
      - name: display_branch
28
        in: query
29
        description: Filter by display branch
30
        required: false
31
        type: string
32
      - name: display_type
33
        in: query
34
        description: Filter by display type
35
        required: false
36
        type: string
37
      - $ref: "../swagger.yaml#/parameters/match"
38
      - $ref: "../swagger.yaml#/parameters/order_by"
39
      - $ref: "../swagger.yaml#/parameters/page"
40
      - $ref: "../swagger.yaml#/parameters/per_page"
41
      - $ref: "../swagger.yaml#/parameters/q_param"
42
      - $ref: "../swagger.yaml#/parameters/q_body"
43
      - $ref: "../swagger.yaml#/parameters/request_id_header"
44
      - name: x-koha-embed
45
        in: header
46
        required: false
47
        description: Embed list sent as a request header
48
        type: array
49
        items:
50
          type: string
51
          enum:
52
            - display_items
53
            - home_library
54
            - holding_library
55
            - item_type
56
            - +strings
57
        collectionFormat: csv
58
    responses:
59
      "200":
60
        description: A list of displays
61
        schema:
62
          type: array
63
          items:
64
            $ref: "../swagger.yaml#/definitions/display"
65
      "400":
66
        description: |
67
          Bad request. Possible `error_code` attribute values:
68
69
            * `invalid_query`
70
        schema:
71
          $ref: "../swagger.yaml#/definitions/error"
72
      "403":
73
        description: Access forbidden
74
        schema:
75
          $ref: "../swagger.yaml#/definitions/error"
76
      "500":
77
        description: |
78
          Internal server error. Possible `error_code` attribute values:
79
80
          * `internal_server_error`
81
        schema:
82
          $ref: "../swagger.yaml#/definitions/error"
83
      "503":
84
        description: Under maintenance
85
        schema:
86
          $ref: "../swagger.yaml#/definitions/error"
87
    x-koha-authorization:
88
      permissions:
89
        displays: "*"
90
  post:
91
    x-mojo-to: Displays#add
92
    operationId: addDisplay
93
    tags:
94
      - displays
95
    summary: Add display
96
    parameters:
97
      - name: body
98
        in: body
99
        description: A JSON object containing information about the new display
100
        required: true
101
        schema:
102
          $ref: "../swagger.yaml#/definitions/display"
103
    produces:
104
      - application/json
105
    responses:
106
      "201":
107
        description: Display added
108
        schema:
109
          $ref: "../swagger.yaml#/definitions/display"
110
      "400":
111
        description: Bad request
112
        schema:
113
          $ref: "../swagger.yaml#/definitions/error"
114
      "401":
115
        description: Authentication required
116
        schema:
117
          $ref: "../swagger.yaml#/definitions/error"
118
      "403":
119
        description: Access forbidden
120
        schema:
121
          $ref: "../swagger.yaml#/definitions/error"
122
      "500":
123
        description: |
124
          Internal server error. Possible `error_code` attribute values:
125
126
          * `internal_server_error`
127
        schema:
128
          $ref: "../swagger.yaml#/definitions/error"
129
      "503":
130
        description: Under maintenance
131
        schema:
132
          $ref: "../swagger.yaml#/definitions/error"
133
    x-koha-authorization:
134
      permissions:
135
        displays: add_display
136
"/displays/{display_id}":
137
  get:
138
    x-mojo-to: Displays#get
139
    operationId: getDisplay
140
    tags:
141
      - displays
142
    summary: Get display
143
    parameters:
144
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
145
      - name: x-koha-embed
146
        in: header
147
        required: false
148
        description: Embed list sent as a request header
149
        type: array
150
        items:
151
          type: string
152
          enum:
153
            - display_items
154
            - home_library
155
            - holding_library
156
            - item_type
157
            - +strings
158
        collectionFormat: csv
159
    produces:
160
      - application/json
161
    responses:
162
      "200":
163
        description: A display
164
        schema:
165
          $ref: "../swagger.yaml#/definitions/display"
166
      "400":
167
        description: Bad request
168
        schema:
169
          $ref: "../swagger.yaml#/definitions/error"
170
      "404":
171
        description: Display not found
172
        schema:
173
          $ref: "../swagger.yaml#/definitions/error"
174
      "500":
175
        description: |
176
          Internal server error. Possible `error_code` attribute values:
177
178
          * `internal_server_error`
179
        schema:
180
          $ref: "../swagger.yaml#/definitions/error"
181
      "503":
182
        description: Under maintenance
183
        schema:
184
          $ref: "../swagger.yaml#/definitions/error"
185
    x-koha-authorization:
186
      permissions:
187
        displays: "*"
188
  put:
189
    x-mojo-to: Displays#update
190
    operationId: updateDisplay
191
    tags:
192
      - displays
193
    summary: Update display
194
    parameters:
195
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
196
      - name: body
197
        in: body
198
        description: A display object
199
        required: true
200
        schema:
201
          $ref: "../swagger.yaml#/definitions/display"
202
    produces:
203
      - application/json
204
    responses:
205
      "200":
206
        description: A display
207
        schema:
208
          $ref: "../swagger.yaml#/definitions/display"
209
      "400":
210
        description: Bad request
211
        schema:
212
          $ref: "../swagger.yaml#/definitions/error"
213
      "401":
214
        description: Authentication required
215
        schema:
216
          $ref: "../swagger.yaml#/definitions/error"
217
      "403":
218
        description: Access forbidden
219
        schema:
220
          $ref: "../swagger.yaml#/definitions/error"
221
      "404":
222
        description: Display not found
223
        schema:
224
          $ref: "../swagger.yaml#/definitions/error"
225
      "500":
226
        description: Internal error
227
        schema:
228
          $ref: "../swagger.yaml#/definitions/error"
229
      "503":
230
        description: Under maintenance
231
        schema:
232
          $ref: "../swagger.yaml#/definitions/error"
233
    x-koha-authorization:
234
      permissions:
235
        displays: edit_display
236
  delete:
237
    x-mojo-to: Displays#delete
238
    operationId: deleteDisplay
239
    tags:
240
      - displays
241
    summary: Delete display
242
    parameters:
243
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
244
    produces:
245
      - application/json
246
    responses:
247
      "204":
248
        description: Display deleted
249
      "400":
250
        description: Bad request
251
        schema:
252
          $ref: "../swagger.yaml#/definitions/error"
253
      "401":
254
        description: Authentication required
255
        schema:
256
          $ref: "../swagger.yaml#/definitions/error"
257
      "403":
258
        description: Access forbidden
259
        schema:
260
          $ref: "../swagger.yaml#/definitions/error"
261
      "404":
262
        description: Display not found
263
        schema:
264
          $ref: "../swagger.yaml#/definitions/error"
265
      "500":
266
        description: Internal error
267
        schema:
268
          $ref: "../swagger.yaml#/definitions/error"
269
      "503":
270
        description: Under maintenance
271
        schema:
272
          $ref: "../swagger.yaml#/definitions/error"
273
    x-koha-authorization:
274
      permissions:
275
        displays: delete_display 
(-)a/api/v1/swagger/paths/displays_config.yaml (+38 lines)
Line 0 Link Here
1
---
2
/displays/config:
3
  get:
4
    x-mojo-to: Displays#config
5
    operationId: getDisplaysConfig
6
    description: This resource returns a list of options needed for the Displays Vue app. EXPERIMENTAL - DO NOT RELY on this, it is subject to change!
7
    summary: get the Displays Config
8
    tags:
9
      - displays
10
    produces:
11
      - application/json
12
    responses:
13
      200:
14
        description: The Displays module config
15
        schema:
16
          $ref: "../swagger.yaml#/definitions/display_config"
17
      400:
18
        description: Bad request
19
        schema:
20
          $ref: "../swagger.yaml#/definitions/error"
21
      403:
22
        description: Access forbidden
23
        schema:
24
          $ref: "../swagger.yaml#/definitions/error"
25
      500:
26
        description: |
27
          Internal server error. Possible `error_code` attribute values:
28
29
          * `internal_server_error`
30
        schema:
31
          $ref: "../swagger.yaml#/definitions/error"
32
      503:
33
        description: Under maintenance
34
        schema:
35
          $ref: "../swagger.yaml#/definitions/error"
36
    x-koha-authorization:
37
      permissions:
38
        displays: "*"
(-)a/api/v1/swagger/paths/public_displayitems.yaml (+94 lines)
Line 0 Link Here
1
---
2
"/public/display/items":
3
  get:
4
    x-mojo-to: DisplayItems#list_public
5
    operationId: listDisplayItemsPublic
6
    tags:
7
      - displayitems
8
    summary: List display items (public)
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: display_id
13
        in: query
14
        description: Filter by display ID
15
        required: false
16
        type: integer
17
      - name: itemnumber
18
        in: query
19
        description: Filter by item number
20
        required: false
21
        type: integer
22
      - name: biblionumber
23
        in: query
24
        description: Filter by bibliographic record number
25
        required: false
26
        type: integer
27
      - $ref: "../swagger.yaml#/parameters/match"
28
      - $ref: "../swagger.yaml#/parameters/order_by"
29
      - $ref: "../swagger.yaml#/parameters/page"
30
      - $ref: "../swagger.yaml#/parameters/per_page"
31
      - $ref: "../swagger.yaml#/parameters/q_param"
32
      - $ref: "../swagger.yaml#/parameters/q_body"
33
      - $ref: "../swagger.yaml#/parameters/request_id_header"
34
    responses:
35
      "200":
36
        description: A list of display items
37
        schema:
38
          type: array
39
          items:
40
            $ref: "../swagger.yaml#/definitions/displayitem"
41
      "400":
42
        description: |
43
          Bad request. Possible `error_code` attribute values:
44
45
            * `invalid_query`
46
        schema:
47
          $ref: "../swagger.yaml#/definitions/error"
48
      "500":
49
        description: |
50
          Internal server error. Possible `error_code` attribute values:
51
52
          * `internal_server_error`
53
        schema:
54
          $ref: "../swagger.yaml#/definitions/error"
55
      "503":
56
        description: Under maintenance
57
        schema:
58
          $ref: "../swagger.yaml#/definitions/error"
59
"/public/display/items/{display_id}/{item_id}":
60
  get:
61
    x-mojo-to: DisplayItems#get_public
62
    operationId: getDisplayItemPublic
63
    tags:
64
      - displayitems
65
    summary: Get display item (public)
66
    parameters:
67
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
68
      - $ref: "../swagger.yaml#/parameters/item_id_pp"
69
    produces:
70
      - application/json
71
    responses:
72
      "200":
73
        description: A display item
74
        schema:
75
          $ref: "../swagger.yaml#/definitions/displayitem"
76
      "400":
77
        description: Bad request
78
        schema:
79
          $ref: "../swagger.yaml#/definitions/error"
80
      "404":
81
        description: Display item not found
82
        schema:
83
          $ref: "../swagger.yaml#/definitions/error"
84
      "500":
85
        description: |
86
          Internal server error. Possible `error_code` attribute values:
87
88
          * `internal_server_error`
89
        schema:
90
          $ref: "../swagger.yaml#/definitions/error"
91
      "503":
92
        description: Under maintenance
93
        schema:
94
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/paths/public_displays.yaml (+124 lines)
Line 0 Link Here
1
---
2
"/public/displays":
3
  get:
4
    x-mojo-to: Displays#list_public
5
    operationId: listDisplaysPublic
6
    tags:
7
      - displays
8
    summary: List displays (public)
9
    produces:
10
      - application/json
11
    parameters:
12
      - name: active
13
        in: query
14
        description: Filter by active status (enabled and within start/end date range)
15
        required: false
16
        type: boolean
17
      - name: enabled
18
        in: query
19
        description: Filter by enabled status
20
        required: false
21
        type: boolean
22
      - name: display_branch
23
        in: query
24
        description: Filter by display branch
25
        required: false
26
        type: string
27
      - name: display_type
28
        in: query
29
        description: Filter by display type
30
        required: false
31
        type: string
32
      - $ref: "../swagger.yaml#/parameters/match"
33
      - $ref: "../swagger.yaml#/parameters/order_by"
34
      - $ref: "../swagger.yaml#/parameters/page"
35
      - $ref: "../swagger.yaml#/parameters/per_page"
36
      - $ref: "../swagger.yaml#/parameters/q_param"
37
      - $ref: "../swagger.yaml#/parameters/q_body"
38
      - $ref: "../swagger.yaml#/parameters/request_id_header"
39
      - name: x-koha-embed
40
        in: header
41
        required: false
42
        description: Embed list sent as a request header
43
        type: array
44
        items:
45
          type: string
46
          enum:
47
            - display_items
48
            - library
49
            - item_type
50
            - +strings
51
        collectionFormat: csv
52
    responses:
53
      "200":
54
        description: A list of displays
55
        schema:
56
          type: array
57
          items:
58
            $ref: "../swagger.yaml#/definitions/display"
59
      "400":
60
        description: |
61
          Bad request. Possible `error_code` attribute values:
62
63
            * `invalid_query`
64
        schema:
65
          $ref: "../swagger.yaml#/definitions/error"
66
      "500":
67
        description: |
68
          Internal server error. Possible `error_code` attribute values:
69
70
          * `internal_server_error`
71
        schema:
72
          $ref: "../swagger.yaml#/definitions/error"
73
      "503":
74
        description: Under maintenance
75
        schema:
76
          $ref: "../swagger.yaml#/definitions/error"
77
"/public/displays/{display_id}":
78
  get:
79
    x-mojo-to: Displays#get_public
80
    operationId: getDisplayPublic
81
    tags:
82
      - displays
83
    summary: Get display (public)
84
    parameters:
85
      - $ref: "../swagger.yaml#/parameters/display_id_pp"
86
      - name: x-koha-embed
87
        in: header
88
        required: false
89
        description: Embed list sent as a request header
90
        type: array
91
        items:
92
          type: string
93
          enum:
94
            - display_items
95
            - library
96
            - item_type
97
            - +strings
98
        collectionFormat: csv
99
    produces:
100
      - application/json
101
    responses:
102
      "200":
103
        description: A display
104
        schema:
105
          $ref: "../swagger.yaml#/definitions/display"
106
      "400":
107
        description: Bad request
108
        schema:
109
          $ref: "../swagger.yaml#/definitions/error"
110
      "404":
111
        description: Display not found
112
        schema:
113
          $ref: "../swagger.yaml#/definitions/error"
114
      "500":
115
        description: |
116
          Internal server error. Possible `error_code` attribute values:
117
118
          * `internal_server_error`
119
        schema:
120
          $ref: "../swagger.yaml#/definitions/error"
121
      "503":
122
        description: Under maintenance
123
        schema:
124
          $ref: "../swagger.yaml#/definitions/error"
(-)a/api/v1/swagger/swagger.yaml (-1 / +38 lines)
Lines 42-47 definitions: Link Here
42
    $ref: ./definitions/circ-rule-kind.yaml
42
    $ref: ./definitions/circ-rule-kind.yaml
43
  city:
43
  city:
44
    $ref: ./definitions/city.yaml
44
    $ref: ./definitions/city.yaml
45
  display_config:
46
    $ref: ./definitions/display_config.yaml
47
  display:
48
    $ref: ./definitions/display.yaml
49
  displayitem:
50
    $ref: ./definitions/displayitem.yaml
45
  credit:
51
  credit:
46
    $ref: ./definitions/credit.yaml
52
    $ref: ./definitions/credit.yaml
47
  debit:
53
  debit:
Lines 327-332 paths: Link Here
327
    $ref: ./paths/cities.yaml#/~1cities
333
    $ref: ./paths/cities.yaml#/~1cities
328
  "/cities/{city_id}":
334
  "/cities/{city_id}":
329
    $ref: "./paths/cities.yaml#/~1cities~1{city_id}"
335
    $ref: "./paths/cities.yaml#/~1cities~1{city_id}"
336
  /displays/config:
337
    $ref: ./paths/displays_config.yaml#/~1displays~1config
338
  /displays:
339
    $ref: ./paths/displays.yaml#/~1displays
340
  "/displays/{display_id}":
341
    $ref: "./paths/displays.yaml#/~1displays~1{display_id}"
342
  /display/items:
343
    $ref: ./paths/displayitems.yaml#/~1display~1items
344
  /display/items/batch:
345
    $ref: ./paths/displayitems.yaml#/~1display~1items~1batch
346
  /display/items/{display_id}/{item_id}:
347
    $ref: ./paths/displayitems.yaml#/~1display~1items~1{display_id}~1{item_id}
330
  "/clubs/{club_id}/holds":
348
  "/clubs/{club_id}/holds":
331
    $ref: "./paths/clubs.yaml#/~1clubs~1{club_id}~1holds"
349
    $ref: "./paths/clubs.yaml#/~1clubs~1{club_id}~1holds"
332
  /config/smtp_servers:
350
  /config/smtp_servers:
Lines 553-558 paths: Link Here
553
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}"
571
    $ref: "./paths/biblios.yaml#/~1public~1biblios~1{biblio_id}"
554
  "/public/checkouts/availability":
572
  "/public/checkouts/availability":
555
    $ref: ./paths/checkouts.yaml#/~1public~1checkouts~1availability
573
    $ref: ./paths/checkouts.yaml#/~1public~1checkouts~1availability
574
  "/public/display/items":
575
    $ref: "./paths/public_displayitems.yaml#/~1public~1display~1items"
576
  "/public/display/items/{display_id}/{item_id}":
577
    $ref: "./paths/public_displayitems.yaml#/~1public~1display~1items~1{display_id}~1{item_id}"
578
  "/public/displays":
579
    $ref: "./paths/public_displays.yaml#/~1public~1displays"
580
  "/public/displays/{display_id}":
581
    $ref: "./paths/public_displays.yaml#/~1public~1displays~1{display_id}"
556
  "/public/items":
582
  "/public/items":
557
    $ref: "./paths/items.yaml#/~1public~1items"
583
    $ref: "./paths/items.yaml#/~1public~1items"
558
  "/public/biblios/{biblio_id}/items":
584
  "/public/biblios/{biblio_id}/items":
Lines 747-752 parameters: Link Here
747
    name: city_id
773
    name: city_id
748
    required: true
774
    required: true
749
    type: integer
775
    type: integer
776
  display_id_pp:
777
    description: Display internal identifier
778
    in: path
779
    name: display_id
780
    required: true
781
    type: integer
750
  club_id_pp:
782
  club_id_pp:
751
    description: Internal club identifier
783
    description: Internal club identifier
752
    in: path
784
    in: path
Lines 1242-1247 tags: Link Here
1242
  - description: "Manage cities\n"
1274
  - description: "Manage cities\n"
1243
    name: cities
1275
    name: cities
1244
    x-displayName: Cities
1276
    x-displayName: Cities
1277
  - description: "Manage displays\n"
1278
    name: displays
1279
    x-displayName: Displays
1280
  - description: "Manage display items\n"
1281
    name: displayitems
1282
    x-displayName: Display items
1245
  - description: "Manage patron clubs\n"
1283
  - description: "Manage patron clubs\n"
1246
    name: clubs
1284
    name: clubs
1247
    x-displayName: Clubs
1285
    x-displayName: Clubs
1248
- 

Return to bug 14962