2022-12-20 21:27:52 +01:00
|
|
|
|
class APIGeoService
|
|
|
|
|
class << self
|
|
|
|
|
def countries(locale: I18n.locale)
|
|
|
|
|
I18nData.countries(locale)
|
|
|
|
|
.merge(get_localized_additional_countries(locale))
|
|
|
|
|
.map { |(code, name)| { name:, code: } }
|
2022-12-22 17:24:08 +01:00
|
|
|
|
.sort_by { I18n.transliterate(_1[:name].tr('î', 'Î')) }
|
2022-12-20 21:27:52 +01:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def country_name(code, locale: I18n.locale)
|
|
|
|
|
countries(locale:).find { _1[:code] == code }&.dig(:name)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def country_code(name)
|
|
|
|
|
return if name.nil?
|
|
|
|
|
code = I18nData.country_code(name) || I18nData.country_code(name.humanize) || I18nData.country_code(name.titleize)
|
|
|
|
|
if code.nil?
|
|
|
|
|
countries_index_fr[I18n.transliterate(name).upcase]&.dig(:code)
|
|
|
|
|
else
|
|
|
|
|
code
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def regions
|
|
|
|
|
get_from_api_geo(:regions).sort_by { I18n.transliterate(_1[:name]) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def region_name(code)
|
|
|
|
|
regions.find { _1[:code] == code }&.dig(:name)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def region_code(name)
|
|
|
|
|
return if name.nil?
|
|
|
|
|
regions.find { _1[:name] == name }&.dig(:code)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def departements
|
2023-02-22 17:22:00 +01:00
|
|
|
|
[{ code: '99', name: 'Etranger' }] + get_from_api_geo('departements?zone=metro,drom,com').sort_by { _1[:code] }
|
2022-12-20 21:27:52 +01:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def departement_name(code)
|
|
|
|
|
departements.find { _1[:code] == code }&.dig(:name)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def departement_code(name)
|
|
|
|
|
return if name.nil?
|
|
|
|
|
departements.find { _1[:name] == name }&.dig(:code)
|
|
|
|
|
end
|
|
|
|
|
|
2023-02-23 14:35:28 +01:00
|
|
|
|
def communes(departement_code)
|
|
|
|
|
get_from_api_geo(
|
|
|
|
|
"communes?codeDepartement=#{departement_code}",
|
|
|
|
|
additional_keys: { postal_codes: :codesPostaux }
|
|
|
|
|
).sort_by { I18n.transliterate(_1[:name]) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def commune_name(departement_code, code)
|
|
|
|
|
communes(departement_code).find { _1[:code] == code }&.dig(:name)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def commune_code(departement_code, name)
|
|
|
|
|
communes(departement_code).find { _1[:name] == name }&.dig(:code)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def commune_postal_codes(departement_code, code)
|
|
|
|
|
communes(departement_code).find { _1[:code] == code }&.dig(:postal_codes)
|
|
|
|
|
end
|
|
|
|
|
|
2023-01-19 09:43:19 +01:00
|
|
|
|
def epcis(departement_code)
|
|
|
|
|
get_from_api_geo("epcis?codeDepartement=#{departement_code}").sort_by { I18n.transliterate(_1[:name]) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def epci_name(departement_code, code)
|
|
|
|
|
epcis(departement_code).find { _1[:code] == code }&.dig(:name)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def epci_code(departement_code, name)
|
|
|
|
|
epcis(departement_code).find { _1[:name] == name }&.dig(:code)
|
|
|
|
|
end
|
|
|
|
|
|
2022-12-20 21:27:52 +01:00
|
|
|
|
private
|
|
|
|
|
|
2023-02-23 14:35:28 +01:00
|
|
|
|
def get_from_api_geo(scope, additional_keys: {})
|
2022-12-20 21:27:52 +01:00
|
|
|
|
Rails.cache.fetch("api_geo_#{scope}", expires_in: 1.year) do
|
|
|
|
|
response = Typhoeus.get("#{API_GEO_URL}/#{scope}")
|
2023-02-23 14:35:28 +01:00
|
|
|
|
JSON.parse(response.body)
|
|
|
|
|
.map(&:symbolize_keys)
|
|
|
|
|
.map do |result|
|
|
|
|
|
data = { name: result[:nom].tr("'", '’'), code: result[:code] }
|
|
|
|
|
additional_keys.each { |key, value| data = data.merge(key => result[value]) }
|
|
|
|
|
data
|
|
|
|
|
end
|
2022-12-20 21:27:52 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def countries_index_fr
|
|
|
|
|
Rails.cache.fetch('countries_index_fr', expires_in: 1.year) do
|
|
|
|
|
countries(locale: 'FR').index_by { I18n.transliterate(_1[:name]).upcase }
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def get_localized_additional_countries(locale)
|
|
|
|
|
additional_countries[locale.to_s.upcase] || {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def additional_countries
|
|
|
|
|
{
|
|
|
|
|
'FR' => { 'XK' => 'Kosovo' },
|
|
|
|
|
'EN' => { 'XK' => 'Kosovo' }
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|