demarches-normaliennes/app/services/annuaire_service_public_service.rb

52 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class AnnuaireServicePublicService
include Dry::Monads[:result]
def call(siret:)
result = API::Client.new.call(url: url(siret), schema:, timeout: 1.second)
case result
in Success(body:)
result = body[:results].first
if result.present?
Success(
result.slice(:nom, :adresse, :adresse_courriel).merge(
telephone: maybe_json_parse(result[:telephone]),
plage_ouverture: maybe_json_parse(result[:plage_ouverture]),
adresse: maybe_json_parse(result[:adresse])
)
)
else
Failure(API::Client::Error[:not_found, 404, false, "No result found for this SIRET."])
end
in Failure(code:, reason:) if code.in?(401..403)
Sentry.capture_message("#{self.class.name}: #{reason} code: #{code}", extra: { siret: })
Failure(API::Client::Error[:unauthorized, code, false, reason])
in Failure(type: :schema, code:, reason:)
reason.errors[0].first
Sentry.capture_exception(reason, extra: { siret:, code: })
Failure(API::Client::Error[:schema, code, false, reason])
else
result
end
end
private
def schema
JSONSchemer.schema(Rails.root.join('app/schemas/service-public.json'))
end
def url(siret)
"https://api-lannuaire.service-public.fr/api/explore/v2.1/catalog/datasets/api-lannuaire-administration/records?where=siret:#{siret}"
end
def maybe_json_parse(value)
return nil if value.blank?
JSON.parse(value)
end
end