tech(refactor): DataSources::CommuneController, move request methods to fetch and format commune searched by postal_code or name

This commit is contained in:
mfo 2024-09-05 17:50:32 +02:00
parent 5abba5a166
commit ace2f4382f
No known key found for this signature in database
GPG key ID: 7CE3E1F5B794A8EC
2 changed files with 66 additions and 68 deletions

View file

@ -3,12 +3,12 @@
class DataSources::CommuneController < ApplicationController class DataSources::CommuneController < ApplicationController
def search def search
if params[:q].present? && params[:q].length > 1 if params[:q].present? && params[:q].length > 1
response = fetch_results response = APIGeoService.commune_by_name_or_postal_code(params[:q])
if response.success? if response.success?
results = JSON.parse(response.body, symbolize_names: true) results = JSON.parse(response.body, symbolize_names: true)
render json: format_results(results) render json: APIGeoService.format_commune_response(results, params[:with_combined_code])
else else
render json: [] render json: []
end end
@ -16,70 +16,4 @@ class DataSources::CommuneController < ApplicationController
render json: [] render json: []
end end
end end
private
def fetch_results
if postal_code?(params[:q])
fetch_by_postal_code(params[:q])
else
fetch_by_name(params[:q])
end
end
def fetch_by_name(name)
Typhoeus.get("#{API_GEO_URL}/communes", params: {
type: 'commune-actuelle,arrondissement-municipal',
nom: name,
boost: 'population',
limit: 100
}, timeout: 3)
end
def fetch_by_postal_code(postal_code)
Typhoeus.get("#{API_GEO_URL}/communes", params: {
type: 'commune-actuelle,arrondissement-municipal',
codePostal: postal_code,
boost: 'population',
limit: 50
}, timeout: 3)
end
def postal_code?(string)
string.match?(/\A[-+]?\d+\z/) ? true : false
end
def format_results(results)
results.reject(&method(:code_metropole?)).flat_map do |result|
item = {
name: result[:nom].tr("'", ''),
code: result[:code],
epci_code: result[:codeEpci],
departement_code: result[:codeDepartement]
}.compact
if result[:codesPostaux].present?
result[:codesPostaux].map { item.merge(postal_code: _1) }
else
[item]
end.map do |item|
if params[:with_combined_code].present?
{
label: "#{item[:name]} (#{item[:postal_code]})",
value: "#{item[:code]}-#{item[:postal_code]}"
}
else
{
label: "#{item[:name]} (#{item[:postal_code]})",
value: item[:code],
data: item[:postal_code]
}
end
end
end
end
def code_metropole?(result)
result[:code].in?(['75056', '13055', '69123'])
end
end end

View file

@ -84,6 +84,14 @@ class APIGeoService
communes(departement_code).find { _1[:code] == code }&.dig(:name) communes(departement_code).find { _1[:code] == code }&.dig(:name)
end end
def commune_by_name_or_postal_code(query)
if postal_code?(query)
fetch_by_postal_code(query)
else
fetch_by_name(query)
end
end
def commune_code(departement_code, name) def commune_code(departement_code, name)
communes(departement_code).find { _1[:name] == name }&.dig(:code) communes(departement_code).find { _1[:name] == name }&.dig(:code)
end end
@ -215,8 +223,42 @@ class APIGeoService
commune_name(department_code, city_code) || fallback commune_name(department_code, city_code) || fallback
end end
def format_commune_response(results, with_combined_code)
results.reject(&method(:code_metropole?)).flat_map do |result|
item = {
name: result[:nom].tr("'", ''),
code: result[:code],
epci_code: result[:codeEpci],
departement_code: result[:codeDepartement]
}.compact
if result[:codesPostaux].present?
result[:codesPostaux].map { item.merge(postal_code: _1) }
else
[item]
end.map do |item|
if with_combined_code.present?
{
label: "#{item[:name]} (#{item[:postal_code]})",
value: "#{item[:code]}-#{item[:postal_code]}"
}
else
{
label: "#{item[:name]} (#{item[:postal_code]})",
value: item[:code],
data: item[:postal_code]
}
end
end
end
end
private private
def code_metropole?(result)
result[:code].in?(['75056', '13055', '69123'])
end
def communes_by_postal_code_map def communes_by_postal_code_map
Rails.cache.fetch('api_geo_communes', expires_in: 1.day, version: 3) do Rails.cache.fetch('api_geo_communes', expires_in: 1.day, version: 3) do
departements departements
@ -251,6 +293,28 @@ class APIGeoService
private private
def fetch_by_name(name)
Typhoeus.get("#{API_GEO_URL}/communes", params: {
type: 'commune-actuelle,arrondissement-municipal',
nom: name,
boost: 'population',
limit: 100
}, timeout: 3)
end
def fetch_by_postal_code(postal_code)
Typhoeus.get("#{API_GEO_URL}/communes", params: {
type: 'commune-actuelle,arrondissement-municipal',
codePostal: postal_code,
boost: 'population',
limit: 50
}, timeout: 3)
end
def postal_code?(string)
string.match?(/\A[-+]?\d+\z/) ? true : false
end
def ban_address_schema def ban_address_schema
JSONSchemer.schema(Rails.root.join('app/schemas/adresse-ban.json')) JSONSchemer.schema(Rails.root.join('app/schemas/adresse-ban.json'))
end end