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 259-262 sub import_from_list { Link Here
259
    };
262
    };
260
}
263
}
261
264
265
266
=head3 import_from_kbart_file
267
268
=cut
269
270
sub import_from_kbart_file {
271
    my $c = shift or return;
272
273
    my $file = $c->req->json;
274
275
    return try {
276
        my @job_ids;
277
        my @invalid_columns;
278
        my $max_allowed_packet = C4::Context->dbh->selectrow_array(q{SELECT @@max_allowed_packet});
279
        my $file_content       = defined( $file->{file_content} ) ? decode_base64( $file->{file_content} ) : "";
280
        $file_content =~ s/\n/\r/g;
281
        my @lines          = split /\r/, $file_content;
282
        my @column_headers = split /\t/, $lines[0];
283
        shift @lines;    # Remove headers row
284
        my @remove_null_lines = grep $_ ne '', @lines;
285
286
        # Check that the column headers in the file match the standardised KBART phase II columns
287
        # If not, return a warning before the job is queued
288
        my @valid_headers = Koha::BackgroundJob::ImportKBARTFile::get_valid_headers();
289
        foreach my $header (@column_headers) {
290
            if ( !grep { $_ eq $header } @valid_headers ) {
291
                push @invalid_columns, $header;
292
            }
293
        }
294
        return $c->render(
295
            status  => 201,
296
            openapi => { invalid_columns => \@invalid_columns, valid_columns => \@valid_headers }
297
        ) if scalar(@invalid_columns) > 0;
298
299
        my $file_size = length($file_content);
300
301
        # If the file is too large, we can break the file into smaller chunks and enqueue one job per chunk
302
        if ( $file_size > $max_allowed_packet ) {
303
304
            my $max_number_of_lines = Koha::BackgroundJob::ImportKBARTFile::calculate_chunked_file_size(
305
                $file_size, $max_allowed_packet,
306
                scalar(@remove_null_lines)
307
            );
308
            my @chunked_files;
309
            push @chunked_files, [ splice @remove_null_lines, 0, $max_number_of_lines ] while @remove_null_lines;
310
311
            foreach my $chunk (@chunked_files) {
312
                unshift( @{$chunk}, join( "\t", @column_headers ) );
313
                my $chunked_file = {
314
                    filename     => $file->{filename},
315
                    file_content => encode_base64( join( "\r", @{$chunk} ) )
316
                };
317
                my $params = { file => $chunked_file };
318
                my $job_id = Koha::BackgroundJob::ImportKBARTFile->new->enqueue($params);
319
                push @job_ids, $job_id;
320
            }
321
        } else {
322
            my $params = { file => $file };
323
            my $job_id = Koha::BackgroundJob::ImportKBARTFile->new->enqueue($params);
324
            push @job_ids, $job_id;
325
        }
326
327
        return $c->render(
328
            status  => 201,
329
            openapi => { job_ids => \@job_ids }
330
        );
331
    } catch {
332
        $c->unhandled_exception($_);
333
    };
334
}
335
262
1;
336
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