refacto: better error management

This commit is contained in:
Sébastien Carceles 2023-01-14 10:13:26 +01:00 committed by sebastiencarceles
parent b6c74b0e83
commit 2ad4e4c01f
3 changed files with 38 additions and 19 deletions

View file

@ -3,6 +3,11 @@ class Champs::SiretController < ApplicationController
def show
@champ = policy_scope(Champ).find(params[:champ_id])
@siret = @champ.fetch_etablissement!(read_param_value(@champ.input_name, 'value'), current_user)
if @champ.fetch_etablissement!(read_param_value(@champ.input_name, 'value'), current_user)
@siret = @champ.etablissement.siret
else
@siret = @champ.etablissement_fetch_error_key
end
end
end

View file

@ -1,34 +1,38 @@
module SiretChampEtablissementFetchableConcern
extend ActiveSupport::Concern
def fetch_etablissement!(siret, user)
return clear if siret.empty?
return clear(error: :invalid) unless Siret.new(siret: siret).valid? # i18n-tasks-use t('errors.messages.invalid_siret')
return clear(error: :not_found) unless (etablissement = APIEntrepriseService.create_etablissement(self, siret, user.id)) # i18n-tasks-use t('errors.messages.siret_not_found')
attr_reader :etablissement_fetch_error_key
return update_etablissement!(etablissement)
def fetch_etablissement!(siret, user)
return clear_etablissement!(:empty) if siret.empty?
return clear_etablissement!(:invalid) unless Siret.new(siret: siret).valid? # i18n-tasks-use t('errors.messages.invalid_siret')
return clear_etablissement!(:not_found) unless (etablissement = APIEntrepriseService.create_etablissement(self, siret, user&.id)) # i18n-tasks-use t('errors.messages.siret_not_found')
update!(value: siret, etablissement: etablissement)
rescue => error
if error.try(:network_error?) && !APIEntrepriseService.api_up?
# TODO: notify ops
etablissement = APIEntrepriseService.create_etablissement_as_degraded_mode(self, siret, user.id)
return update_etablissement!(etablissement, error: :api_entreprise_down)
update!(
value: siret,
etablissement: APIEntrepriseService.create_etablissement_as_degraded_mode(self, siret, user.id)
)
@etablissement_fetch_error_key = :api_entreprise_down
false
else
Sentry.capture_exception(error, extra: { dossier_id: dossier_id, siret: siret })
return clear(error: :network_error) # i18n-tasks-use t('errors.messages.siret_network_error')
clear_etablissement!(:network_error) # i18n-tasks-use t('errors.messages.siret_network_error')
end
end
private
def update_etablissement!(etablissement, error: nil)
update!(value: etablissement.siret, etablissement: etablissement)
error.presence || etablissement.siret
end
def clear_etablissement!(error_key)
@etablissement_fetch_error_key = error_key
def clear(error: nil)
etablissement_to_destroy = etablissement
update!(etablissement: nil)
etablissement_to_destroy&.destroy
error.presence
false
end
end

View file

@ -20,13 +20,18 @@ RSpec.describe SiretChampEtablissementFetchableConcern do
it { expect { fetch_etablissement! }.to change { Etablissement.count }.by(-1) }
it { expect(fetch_etablissement!).to eq(error) }
it { expect(fetch_etablissement!).to eq(false) }
it 'populates the etablissement_fetch_error_key' do
fetch_etablissement!
expect(champ.etablissement_fetch_error_key).to eq(error)
end
end
context 'when the SIRET is empty' do
let(:siret) { '' }
it_behaves_like 'an error occured', nil
it_behaves_like 'an error occured', :empty
end
context 'when the SIRET is invalid' do
@ -63,7 +68,12 @@ RSpec.describe SiretChampEtablissementFetchableConcern do
it { expect { fetch_etablissement! }.to change { Etablissement.count }.by(1) }
it { expect(fetch_etablissement!).to eq(:api_entreprise_down) }
it { expect(fetch_etablissement!).to eq(false) }
it 'populates the etablissement_fetch_error_key' do
fetch_etablissement!
expect(champ.etablissement_fetch_error_key).to eq(:api_entreprise_down)
end
end
context 'when the SIRET is valid but unknown' do
@ -86,7 +96,7 @@ RSpec.describe SiretChampEtablissementFetchableConcern do
it { expect { fetch_etablissement! }.to change { Etablissement.count }.by(1) }
it { expect(fetch_etablissement!).to eq(siret) }
it { expect(fetch_etablissement!).to eq(true) }
end
end
end