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

(-)a/Koha/REST/V1/ERM/EHoldings/Titles.pm (+13 lines)
Lines 122-125 sub import_from_list { Link Here
122
122
123
    return Koha::REST::V1::ERM::EHoldings::Titles::Local::import_from_list($c);
123
    return Koha::REST::V1::ERM::EHoldings::Titles::Local::import_from_list($c);
124
}
124
}
125
126
=head3 import_from_kbart_file
127
128
Controller function that handles importing a kbart file
129
130
=cut
131
132
sub import_from_kbart_file {
133
    my $c = shift->openapi->valid_input or return;
134
135
    return Koha::REST::V1::ERM::EHoldings::Titles::Local::import_from_kbart_file($c);
136
}
137
125
1;
138
1;
(-)a/Koha/REST/V1/ERM/EHoldings/Titles/Local.pm (+74 lines)
Lines 21-29 use Mojo::Base 'Mojolicious::Controller'; Link Here
21
21
22
use Koha::ERM::EHoldings::Titles;
22
use Koha::ERM::EHoldings::Titles;
23
use Koha::BackgroundJob::CreateEHoldingsFromBiblios;
23
use Koha::BackgroundJob::CreateEHoldingsFromBiblios;
24
use Koha::BackgroundJob::ImportKBARTFile;
24
25
25
use Scalar::Util qw( blessed );
26
use Scalar::Util qw( blessed );
26
use Try::Tiny qw( catch try );
27
use Try::Tiny qw( catch try );
28
use MIME::Base64 qw( decode_base64 encode_base64 );
29
use POSIX qw( floor );
27
30
28
=head1 API
31
=head1 API
29
32
Lines 260-263 sub import_from_list { Link Here
260
    };
263
    };
261
}
264
}
262
265
266
267
=head3 import_from_kbart_file
268
269
=cut
270
271
sub import_from_kbart_file {
272
    my $c = shift or return;
273
274
    my $file = $c->req->json;
275
276
    return try {
277
        my @job_ids;
278
        my @invalid_columns;
279
        my $max_allowed_packet = C4::Context->dbh->selectrow_array(q{SELECT @@max_allowed_packet});
280
        my $file_content       = defined( $file->{file_content} ) ? decode_base64( $file->{file_content} ) : "";
281
        $file_content =~ s/\n/\r/g;
282
        my @lines          = split /\r/, $file_content;
283
        my @column_headers = split /\t/, $lines[0];
284
        shift @lines;    # Remove headers row
285
        my @remove_null_lines = grep $_ ne '', @lines;
286
287
        # Check that the column headers in the file match the standardised KBART phase II columns
288
        # If not, return a warning before the job is queued
289
        my @valid_headers = Koha::BackgroundJob::ImportKBARTFile::get_valid_headers();
290
        foreach my $header (@column_headers) {
291
            if ( !grep { $_ eq $header } @valid_headers ) {
292
                push @invalid_columns, $header;
293
            }
294
        }
295
        return $c->render(
296
            status  => 201,
297
            openapi => { invalid_columns => \@invalid_columns, valid_columns => \@valid_headers }
298
        ) if scalar(@invalid_columns) > 0;
299
300
        my $file_size = length($file_content);
301
302
        # If the file is too large, we can break the file into smaller chunks and enqueue one job per chunk
303
        if ( $file_size > $max_allowed_packet ) {
304
305
            my $max_number_of_lines = Koha::BackgroundJob::ImportKBARTFile::calculate_chunked_file_size(
306
                $file_size, $max_allowed_packet,
307
                scalar(@remove_null_lines)
308
            );
309
            my @chunked_files;
310
            push @chunked_files, [ splice @remove_null_lines, 0, $max_number_of_lines ] while @remove_null_lines;
311
312
            foreach my $chunk (@chunked_files) {
313
                unshift( @{$chunk}, join( "\t", @column_headers ) );
314
                my $chunked_file = {
315
                    filename     => $file->{filename},
316
                    file_content => encode_base64( join( "\r", @{$chunk} ) )
317
                };
318
                my $params = { file => $chunked_file };
319
                my $job_id = Koha::BackgroundJob::ImportKBARTFile->new->enqueue($params);
320
                push @job_ids, $job_id;
321
            }
322
        } else {
323
            my $params = { file => $file };
324
            my $job_id = Koha::BackgroundJob::ImportKBARTFile->new->enqueue($params);
325
            push @job_ids, $job_id;
326
        }
327
328
        return $c->render(
329
            status  => 201,
330
            openapi => { job_ids => \@job_ids }
331
        );
332
    } catch {
333
        $c->unhandled_exception($_);
334
    };
335
}
336
263
1;
337
1;
(-)a/api/v1/swagger/paths/erm_eholdings_titles.yaml (+70 lines)
Lines 493-495 Link Here
493
    x-koha-authorization:
493
    x-koha-authorization:
494
      permissions:
494
      permissions:
495
        erm: 1
495
        erm: 1
496
/erm/eholdings/local/titles/import_kbart:
497
  post:
498
    x-mojo-to: ERM::EHoldings::Titles#import_from_kbart_file
499
    operationId: importErmEHoldingsTitlesFromKbart
500
    tags:
501
      - erm_eholdings_titles
502
    summary: Import local titles from a KBART file
503
    consumes:
504
      - application/json
505
    produces:
506
      - application/json
507
    parameters:
508
      - description: The file to import
509
        in: body
510
        name: body
511
        required: true
512
        schema:
513
          type: object
514
          properties:
515
            filename:
516
              type: string
517
            file_content:
518
              type: string
519
          additionalProperties: false
520
    responses:
521
      201:
522
        description: Successfully enqueued the import job
523
        schema:
524
          type: object
525
          properties:
526
            job_ids:
527
              type: array
528
            invalid_columns:
529
              type: array
530
            valid_columns:
531
              type: array
532
          additionalProperties: false
533
      400:
534
        description: Bad parameter
535
        schema:
536
          $ref: "../swagger.yaml#/definitions/error"
537
      401:
538
        description: Authentication required
539
        schema:
540
          $ref: "../swagger.yaml#/definitions/error"
541
      403:
542
        description: Access forbidden
543
        schema:
544
          $ref: "../swagger.yaml#/definitions/error"
545
      404:
546
        description: Ressource not found
547
        schema:
548
          $ref: "../swagger.yaml#/definitions/error"
549
      409:
550
        description: Conflict in creating resource
551
        schema:
552
          $ref: "../swagger.yaml#/definitions/error"
553
      500:
554
        description: |-
555
          Internal server error. Possible `error_code` attribute values:
556
          * `internal_server_error`
557
        schema:
558
          $ref: "../swagger.yaml#/definitions/error"
559
      503:
560
        description: Under maintenance
561
        schema:
562
          $ref: "../swagger.yaml#/definitions/error"
563
    x-koha-authorization:
564
      permissions:
565
        erm: 1
(-)a/api/v1/swagger/swagger.yaml (-1 / +2 lines)
Lines 321-326 paths: Link Here
321
    $ref: "./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1{provider}~1titles"
321
    $ref: "./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1{provider}~1titles"
322
  /erm/eholdings/local/titles/import:
322
  /erm/eholdings/local/titles/import:
323
    $ref: ./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1local~1titles~1import
323
    $ref: ./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1local~1titles~1import
324
  /erm/eholdings/local/titles/import_kbart:
325
    $ref: ./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1local~1titles~1import_kbart
324
  "/erm/eholdings/{provider}/titles/{title_id}":
326
  "/erm/eholdings/{provider}/titles/{title_id}":
325
    $ref: "./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1{provider}~1titles~1{title_id}"
327
    $ref: "./paths/erm_eholdings_titles.yaml#/~1erm~1eholdings~1{provider}~1titles~1{title_id}"
326
  "/erm/eholdings/{provider}/titles/{title_id}/resources":
328
  "/erm/eholdings/{provider}/titles/{title_id}/resources":
327
- 

Return to bug 34788