53 lines
1.5 KiB
Ruby
53 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
|