diff --git a/Koha/BackgroundJob/ErmSushiHarvester.pm b/Koha/BackgroundJob/ErmSushiHarvester.pm
index 8d3e8c11c8..5dadc0b60f 100644
--- a/Koha/BackgroundJob/ErmSushiHarvester.pm
+++ b/Koha/BackgroundJob/ErmSushiHarvester.pm
@@ -155,6 +155,7 @@ sub set_job_size {
type => 'success', # success, warning or error
code => 'object_added', # object_added or object_already_exists
title => $row->{Title},
+ message => 'message',
}
);
diff --git a/Koha/ERM/EUsage/UsageDataProvider.pm b/Koha/ERM/EUsage/UsageDataProvider.pm
index 0f23a9367f..b956b09382 100644
--- a/Koha/ERM/EUsage/UsageDataProvider.pm
+++ b/Koha/ERM/EUsage/UsageDataProvider.pm
@@ -215,11 +215,17 @@ sub harvest_sushi {
return;
}
+ my $decoded_response = decode_json( $response->decoded_content );
+
+ return if $self->_sushi_errors($decoded_response);
+
# Parse the SUSHI response
my $sushi_counter =
- Koha::ERM::EUsage::SushiCounter->new( { response => decode_json( $response->decoded_content ) } );
+ Koha::ERM::EUsage::SushiCounter->new( { response => $decoded_response } );
my $counter_file = $sushi_counter->get_COUNTER_from_SUSHI;
+ return if $self->_counter_file_size_too_large($counter_file);
+
$self->counter_files(
[
{
@@ -440,6 +446,77 @@ sub _check_trailing_character {
return $url;
}
+=head3 _sushi_errors
+
+Checks and handles possible errors in the SUSHI response
+Additionally, adds background job report message(s) if that is the case
+
+=cut
+
+sub _sushi_errors {
+ my ( $self, $decoded_response ) = @_;
+
+ if ( $decoded_response->{Severity} ) {
+ $self->{job_callbacks}->{add_message_callback}->(
+ {
+ type => 'error',
+ code => $decoded_response->{Code},
+ message => $decoded_response->{Severity} . ' - ' . $decoded_response->{Message},
+ }
+ ) if $self->{job_callbacks};
+ return 1;
+ }
+
+ if ( $decoded_response->{Report_Header}->{Exceptions} ) {
+ foreach my $exception ( @{ $decoded_response->{Report_Header}->{Exceptions} } ) {
+ $self->{job_callbacks}->{add_message_callback}->(
+ {
+ type => 'error',
+ code => $exception->{Code},
+ message => $exception->{Message} . ' - ' . $exception->{Data},
+ }
+ ) if $self->{job_callbacks};
+ }
+ return 1;
+ }
+
+ if ( scalar @{ $decoded_response->{Report_Items} } == 0 ) {
+ $self->{job_callbacks}->{add_message_callback}->(
+ {
+ type => 'error',
+ code => 'no_items',
+ }
+ ) if $self->{job_callbacks};
+ return 1;
+ }
+
+ return 0;
+}
+
+=head3 _counter_file_size_too_large
+
+Checks whether a counter file size exceeds the size allowed by the database or not
+Additionally, adds a background job report message if that is the case
+
+=cut
+
+sub _counter_file_size_too_large {
+ my ( $self, $counter_file ) = @_;
+
+ my $max_allowed_packet = C4::Context->dbh->selectrow_array(q{SELECT @@max_allowed_packet});
+ if ( length($counter_file) > $max_allowed_packet ) {
+ $self->{job_callbacks}->{add_message_callback}->(
+ {
+ type => 'error',
+ code => 'payload_too_large',
+ message => $max_allowed_packet / 1024 / 1024,
+ }
+ ) if $self->{job_callbacks};
+ return 1;
+ }
+ return 0;
+}
+
=head3 _type
=cut
diff --git a/Koha/REST/V1/ERM/EUsage/UsageDataProviders.pm b/Koha/REST/V1/ERM/EUsage/UsageDataProviders.pm
index 8f93299334..e05b529d4e 100644
--- a/Koha/REST/V1/ERM/EUsage/UsageDataProviders.pm
+++ b/Koha/REST/V1/ERM/EUsage/UsageDataProviders.pm
@@ -313,6 +313,10 @@ sub process_COUNTER_file {
? decode_base64( $body->{file_content} )
: "";
+ my $max_allowed_packet = C4::Context->dbh->selectrow_array(q{SELECT @@max_allowed_packet});
+ Koha::Exceptions::PayloadTooLarge->throw("File size exceeds limit defined by server")
+ if length($file_content) > $max_allowed_packet;
+
# Validate the file_content without storing, it'll throw an exception if fail
my $counter_file_validation = Koha::ERM::EUsage::CounterFile->new( { file_content => $file_content } );
$counter_file_validation->validate;
@@ -356,7 +360,7 @@ sub process_COUNTER_file {
} elsif ( $_->isa('Koha::Exceptions::PayloadTooLarge') ) {
return $c->render(
status => 413,
- openapi => { error => $_->error }
+ openapi => { error => $_->description }
);
} elsif ( $_->isa('Koha::Exceptions::ERM::EUsage::CounterFile::UnsupportedRelease') ) {
return $c->render(
diff --git a/api/v1/swagger/paths/erm_usage_data_providers.yaml b/api/v1/swagger/paths/erm_usage_data_providers.yaml
index 4f034ef0d2..f244d8b138 100644
--- a/api/v1/swagger/paths/erm_usage_data_providers.yaml
+++ b/api/v1/swagger/paths/erm_usage_data_providers.yaml
@@ -437,6 +437,10 @@
description: Access forbidden
schema:
$ref: "../swagger.yaml#/definitions/error"
+ 413:
+ description: Payload too large
+ schema:
+ $ref: "../swagger.yaml#/definitions/error"
500:
description: |-
Internal server error. Possible `error_code` attribute values:
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/erm_sushi_harvester.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/erm_sushi_harvester.inc
index 9670e8f321..e52fa732b4 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/erm_sushi_harvester.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/erm_sushi_harvester.inc
@@ -84,12 +84,20 @@
[% END %]
[% SWITCH m.code %]
- [% CASE 'object_already_exists' %]
- [% m.title %] already exists in this data provider and was not created. New usage statistics were verified anyway
- [% CASE 'object_added' %]
- [% m.title %] successfully added
- [% CASE 'object_could_not_be_added' %]
- [% m.title %] could not be processed - please check the logs
+ [% CASE 'object_already_exists' %]
+ [% m.title %] already exists in this data provider and was not created. New usage statistics were verified anyway
+ [% CASE 'object_added' %]
+ [% m.title %] successfully added
+ [% CASE 'object_could_not_be_added' %]
+ [% m.title %] could not be processed - please check the logs
+ [% CASE 'payload_too_large' %]
+ COUNTER report file size exceeds limit defined by the database. Limit is [% m.message %] MB.
+ Please increase this limit or harvest a shorter period.
+ [% CASE 'no_items' %]
+ SUSHI response returned no items.
+ Please try a different harvest period.
+ [% CASE %]
+ SUSHI returned: [% m.message %] [% m.code %]
[% END %]
[% END %]