mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
49 lines
1.4 KiB
Ruby
49 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Our internal data structures are different to the API data strurctures.
|
|
module AddressTransformation
|
|
extend ActiveSupport::Concern
|
|
|
|
def transform_address!(attributes, from, to)
|
|
return unless attributes.key?(from)
|
|
|
|
address = attributes.delete(from)
|
|
|
|
if address.nil?
|
|
attributes[to] = nil
|
|
return
|
|
end
|
|
|
|
address.transform_keys! do |key|
|
|
{
|
|
phone: :phone, latitude: :latitude, longitude: :longitude,
|
|
first_name: :firstname, last_name: :lastname,
|
|
street_address_1: :address1, street_address_2: :address2,
|
|
postal_code: :zipcode,
|
|
locality: :city,
|
|
region: :state,
|
|
country: :country,
|
|
}.with_indifferent_access[key]
|
|
end
|
|
|
|
address[:state] = find_state(address) if address[:state].present?
|
|
address[:country] = find_country(address) if address[:country].present?
|
|
|
|
attributes["#{to}_attributes"] = address
|
|
end
|
|
|
|
private
|
|
|
|
def find_state(address)
|
|
Spree::State.find_by("LOWER(abbr) = ? OR LOWER(name) = ?",
|
|
address.dig(:state, :code)&.downcase,
|
|
address.dig(:state, :name)&.downcase)
|
|
end
|
|
|
|
def find_country(address)
|
|
Spree::Country.find_by("LOWER(iso) = ? OR LOWER(name) = ?",
|
|
address.dig(:country, :code)&.downcase,
|
|
address.dig(:country, :name)&.downcase)
|
|
end
|
|
end
|