diff --git a/app/controllers/champs/siret_controller.rb b/app/controllers/champs/siret_controller.rb index 98ebb81ee..4e8ba19a2 100644 --- a/app/controllers/champs/siret_controller.rb +++ b/app/controllers/champs/siret_controller.rb @@ -16,7 +16,7 @@ class Champs::SiretController < ApplicationController begin etablissement = find_etablissement_with_siret - rescue ApiEntreprise::API::RequestFailed + rescue ApiEntreprise::API::RequestFailed, ApiEntreprise::API::ServiceUnavailable return siret_error(:network_error) end if etablissement.nil? diff --git a/app/jobs/api_entreprise/attestation_sociale_job.rb b/app/jobs/api_entreprise/attestation_sociale_job.rb index 581ed8037..cdaad27d2 100644 --- a/app/jobs/api_entreprise/attestation_sociale_job.rb +++ b/app/jobs/api_entreprise/attestation_sociale_job.rb @@ -1,4 +1,6 @@ class ApiEntreprise::AttestationSocialeJob < ApiEntreprise::Job + retry_on ApiEntreprise::API::ServiceUnavailable, wait: 1.day + def perform(etablissement_id, procedure_id) etablissement = Etablissement.find(etablissement_id) etablissement_params = ApiEntreprise::AttestationSocialeAdapter.new(etablissement.siret, procedure_id).to_params diff --git a/app/lib/api_entreprise/api.rb b/app/lib/api_entreprise/api.rb index c953052ed..716c28f30 100644 --- a/app/lib/api_entreprise/api.rb +++ b/app/lib/api_entreprise/api.rb @@ -20,6 +20,9 @@ class ApiEntreprise::API class BadFormatRequest < StandardError end + class ServiceUnavailable < StandardError + end + def self.entreprise(siren, procedure_id) call(ENTREPRISE_RESOURCE_NAME, siren, procedure_id) end @@ -76,7 +79,9 @@ class ApiEntreprise::API elsif response.code&.between?(401, 499) raise ResourceNotFound, "url: #{url}" elsif response.code == 400 - raise BadFormatRequest, "url: #{url}" + raise BadFormatRequest, "url: #{url}" + elsif response.code == 503 + raise ServiceUnavailable, "url: #{url}" else raise RequestFailed, "HTTP Error Code: #{response.code} for #{url}\nheaders: #{response.headers}\nbody: #{response.body}" end diff --git a/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb b/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb index d68594ecf..5c89302a7 100644 --- a/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb +++ b/spec/jobs/api_entreprise/attestation_sociale_job_spec.rb @@ -1,3 +1,5 @@ +include ActiveJob::TestHelper + RSpec.describe ApiEntreprise::AttestationSocialeJob, type: :job do let(:etablissement) { create(:etablissement, siret: siret) } let(:siret) { '41816609600069' } @@ -21,4 +23,20 @@ RSpec.describe ApiEntreprise::AttestationSocialeJob, type: :job do subject expect(Etablissement.find(etablissement.id).entreprise_attestation_sociale).to be_attached end + + context 'when ApiEntreprise::API::ServiceUnavailable is raised' do + # https://api.rubyonrails.org/classes/ActiveJob/Exceptions/ClassMethods.html#method-i-retry_on + # retry on will try 5 times and then bubble up the error + it 'makes 5 attempts' do + assert_performed_jobs 5 do + ServiceUnavailableJob.perform_later rescue ApiEntreprise::API::ServiceUnavailable + end + end + end + + class ServiceUnavailableJob < ApiEntreprise::AttestationSocialeJob + def perform + raise ApiEntreprise::API::ServiceUnavailable + end + end end