chore(api_entreprise): intercept token expiration for a more contextual frontend message

Auparavant le service échouait silencieusement et ne retournait rien,
ce qui dans les implémentations du front aboutissait au message que
l'établissement/l'entreprise n'a pas été trouvé.

Un type d'erreur spécifique sur l'expiration du token permet d'afficher
le message lié à un problème temporaire de récupération d'infos.
This commit is contained in:
Colin Darie 2022-07-12 19:06:20 +02:00
parent 5e1fc855e3
commit d3232a28cd
7 changed files with 10 additions and 5 deletions

View file

@ -17,7 +17,7 @@ class Champs::SiretController < ApplicationController
begin begin
etablissement = find_etablissement_with_siret etablissement = find_etablissement_with_siret
rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable 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') # i18n-tasks-use t('errors.messages.siret_network_error')
return siret_error(:network_error) return siret_error(:network_error)
end end

View file

@ -114,7 +114,7 @@ module Users
sanitized_siret = siret_model.siret sanitized_siret = siret_model.siret
begin begin
etablissement = APIEntrepriseService.create_etablissement(@dossier, sanitized_siret, current_user.id) etablissement = APIEntrepriseService.create_etablissement(@dossier, sanitized_siret, current_user.id)
rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable rescue APIEntreprise::API::Error::RequestFailed, APIEntreprise::API::Error::BadGateway, APIEntreprise::API::Error::TimedOut, APIEntreprise::API::Error::ServiceUnavailable, APIEntrepriseToken::TokenError
return render_siret_error(t('errors.messages.siret_network_error')) return render_siret_error(t('errors.messages.siret_network_error'))
end end
if etablissement.nil? if etablissement.nil?

View file

@ -82,7 +82,10 @@ class APIEntreprise::API
end end
def self.call_with_siret(resource_name, siret_or_siren, procedure_id, user_id = nil) def self.call_with_siret(resource_name, siret_or_siren, procedure_id, user_id = nil)
return if APIEntrepriseToken.new(token_for_procedure(procedure_id)).expired? if APIEntrepriseToken.new(token_for_procedure(procedure_id)).expired?
raise APIEntrepriseToken::TokenError, I18n.t("api_entreprise.errors.token_expired")
end
url = url(resource_name, siret_or_siren) url = url(resource_name, siret_or_siren)
params = params(siret_or_siren, procedure_id, user_id) params = params(siret_or_siren, procedure_id, user_id)

View file

@ -2,3 +2,4 @@ en:
api_entreprise: api_entreprise:
errors: errors:
missing_token: "the API Entreprise token cannot be blank" missing_token: "the API Entreprise token cannot be blank"
token_expired: "API Entreprise token has expired."

View file

@ -2,3 +2,4 @@ fr:
api_entreprise: api_entreprise:
errors: errors:
missing_token: "le jeton API Entreprise ne peut être vide" missing_token: "le jeton API Entreprise ne peut être vide"
token_expired: "Le jeton API Entreprise a expiré."

View file

@ -271,7 +271,7 @@ describe Users::DossiersController, type: :controller do
let(:api_etablissement_status) { 200 } let(:api_etablissement_status) { 200 }
let(:token_expired) { true } let(:token_expired) { true }
it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_unknown') it_behaves_like 'the request fails with an error', I18n.t('errors.messages.siret_network_error')
end end
context 'when all API informations available' do context 'when all API informations available' do

View file

@ -267,7 +267,7 @@ describe APIEntreprise::API do
end end
it 'makes no call to api-entreprise' do it 'makes no call to api-entreprise' do
subject expect { subject }.to raise_error(APIEntrepriseToken::TokenError)
expect(WebMock).not_to have_requested(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/entreprises\/#{siren}/) expect(WebMock).not_to have_requested(:get, /https:\/\/entreprise.api.gouv.fr\/v2\/entreprises\/#{siren}/)
end end
end end