From c7d54fc750188c392a59a9beaf66c45c3ed65ce1 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 19 Sep 2022 11:03:47 +0200 Subject: [PATCH 1/2] feat(champ siret): display an acknowledgment if siret exist --- app/views/shared/champs/siret/_etablissement.html.haml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/shared/champs/siret/_etablissement.html.haml b/app/views/shared/champs/siret/_etablissement.html.haml index ef2174a2d..269dfa115 100644 --- a/app/views/shared/champs/siret/_etablissement.html.haml +++ b/app/views/shared/champs/siret/_etablissement.html.haml @@ -10,5 +10,8 @@ = t('errors.messages.siret_network_error') - else - - if siret.present? && siret == etablissement&.siret - = render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement) + - if siret.present? + - if siret == etablissement&.siret && raison_sociale_or_name(etablissement).present? + = render EditableChamp::EtablissementTitreComponent.new(etablissement: etablissement) + - else + Ce SIRET existe, nous en récupérons les informations. From 9d2d19800d60805e93d7b8b6a0385532db1de905 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 19 Sep 2022 10:27:20 +0200 Subject: [PATCH 2/2] feat(champ siret): save etablissement in degraded mode if api down and allow submission --- app/controllers/champs/siret_controller.rb | 19 +++++++++++-- .../champs/siret/_etablissement.html.haml | 5 +++- config/locales/fr.yml | 1 + .../champs/siret_controller_spec.rb | 28 ++++++++++++++++++- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/controllers/champs/siret_controller.rb b/app/controllers/champs/siret_controller.rb index fbf8d2495..2ef8aefd5 100644 --- a/app/controllers/champs/siret_controller.rb +++ b/app/controllers/champs/siret_controller.rb @@ -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') diff --git a/app/views/shared/champs/siret/_etablissement.html.haml b/app/views/shared/champs/siret/_etablissement.html.haml index 269dfa115..9b376a7d2 100644 --- a/app/views/shared/champs/siret/_etablissement.html.haml +++ b/app/views/shared/champs/siret/_etablissement.html.haml @@ -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 diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ff8847661..1d3178bbd 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -371,6 +371,7 @@ fr: siret_unknown: 'Désolé, nous n’avons 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 n’avons 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 n’avons pas réussi à enregistrer l’établissement correspondant à ce numéro SIRET' france_connect: connexion: "Erreur lors de la connexion à France Connect." diff --git a/spec/controllers/champs/siret_controller_spec.rb b/spec/controllers/champs/siret_controller_spec.rb index f7ae6a832..83fa28e77 100644 --- a/spec/controllers/champs/siret_controller_spec.rb +++ b/spec/controllers/champs/siret_controller_spec.rb @@ -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 }