feat(champ siret): save etablissement in degraded mode if api down and allow submission

This commit is contained in:
simon lehericey 2022-09-19 10:27:20 +02:00
parent c7d54fc750
commit 9d2d19800d
4 changed files with 48 additions and 5 deletions

View file

@ -17,9 +17,22 @@ class Champs::SiretController < ApplicationController
begin
etablissement = find_etablissement_with_siret
rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable, APIEntrepriseToken::TokenError
# i18n-tasks-use t('errors.messages.siret_network_error')
return siret_error(:network_error)
rescue => error
if error.try(:network_error?) && !APIEntrepriseService.api_up?
# TODO: notify ops
etablissement = APIEntrepriseService.create_etablissement_as_degraded_mode(@champ, @siret, current_user.id)
if !@champ.nil?
@champ.update!(value: etablissement.siret, etablissement: etablissement)
end
@siret = :api_entreprise_down
return
else
Sentry.capture_exception(error, extra: { dossier_id: @champ.dossier_id, siret: @siret })
# i18n-tasks-use t('errors.messages.siret_network_error')
return siret_error(:network_error)
end
end
if etablissement.nil?
# i18n-tasks-use t('errors.messages.siret_not_found')

View file

@ -9,8 +9,11 @@
- when :network_error
= t('errors.messages.siret_network_error')
- when :api_entreprise_down
= t('errors.messages.api_entreprise_down')
- else
- if siret.present?
- if siret.present?
- if siret == etablissement&.siret && raison_sociale_or_name(etablissement).present?
= render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement)
- else

View file

@ -371,6 +371,7 @@ fr:
siret_unknown: 'Désolé, nous navons pas trouvé détablissement enregistré correspondant à ce numéro SIRET.'
siret_network_error: 'Désolé, la récupération des informations SIRET est temporairement indisponible. Veuillez réessayer dans quelques instants.'
siret_not_found: 'Nous navons pas trouvé détablissement correspondant à ce numéro de SIRET.'
api_entreprise_down: 'Notre fournisseur de données semble en panne, nous récupérerons les données plus tard.'
# etablissement_fail: 'Désolé, nous navons pas réussi à enregistrer létablissement correspondant à ce numéro SIRET'
france_connect:
connexion: "Erreur lors de la connexion à France Connect."

View file

@ -66,10 +66,14 @@ describe Champs::SiretController, type: :controller do
end
end
context 'when the API is unavailable' do
context 'when the API is unavailable due to network error' do
let(:siret) { '82161143100015' }
let(:api_etablissement_status) { 503 }
before do
expect(APIEntrepriseService).to receive(:api_up?).and_return(true)
end
subject! { get :show, params: params, format: :turbo_stream }
it 'clears the etablissement and SIRET on the model' do
@ -83,6 +87,28 @@ describe Champs::SiretController, type: :controller do
end
end
context 'when the API is unavailable due to an api maintenance or pb' do
let(:siret) { '82161143100015' }
let(:api_etablissement_status) { 502 }
before do
expect(APIEntrepriseService).to receive(:api_up?).and_return(false)
end
subject! { get :show, params: params, format: :turbo_stream }
it 'saves the etablissement in degraded mode and SIRET on the model' do
champ.reload
expect(champ.value).to eq(siret)
expect(champ.etablissement.siret).to eq(siret)
expect(champ.etablissement.as_degraded_mode?).to be true
end
it 'displays a “API entreprise down” error message' do
expect(response.body).to include('Notre fournisseur de données semble en panne, nous récupérerons les données plus tard.')
end
end
context 'when the SIRET is valid but unknown' do
let(:siret) { '00000000000000' }
let(:api_etablissement_status) { 404 }