2024-03-27 09:16:00 -06:00
|
|
|
module ExchangeRate::Provided
|
|
|
|
extend ActiveSupport::Concern
|
2024-07-08 09:04:59 -04:00
|
|
|
|
2024-03-27 09:16:00 -06:00
|
|
|
include Providable
|
|
|
|
|
|
|
|
class_methods do
|
2024-08-16 12:13:48 -04:00
|
|
|
def provider_healthy?
|
|
|
|
exchange_rates_provider.present? && exchange_rates_provider.healthy?
|
|
|
|
end
|
|
|
|
|
2024-03-27 09:16:00 -06:00
|
|
|
private
|
2024-07-08 09:04:59 -04:00
|
|
|
|
2024-08-09 16:57:33 +02:00
|
|
|
def fetch_rates_from_provider(from:, to:, start_date:, end_date: Date.current, cache: false)
|
2024-07-08 09:04:59 -04:00
|
|
|
return [] unless exchange_rates_provider.present?
|
|
|
|
|
2024-08-09 16:57:33 +02:00
|
|
|
response = exchange_rates_provider.fetch_exchange_rates \
|
|
|
|
from: from,
|
|
|
|
to: to,
|
|
|
|
start_date: start_date,
|
|
|
|
end_date: end_date
|
|
|
|
|
|
|
|
if response.success?
|
|
|
|
response.rates.map do |exchange_rate|
|
|
|
|
rate = ExchangeRate.new \
|
|
|
|
from_currency: from,
|
|
|
|
to_currency: to,
|
|
|
|
date: exchange_rate.dig(:date).to_date,
|
|
|
|
rate: exchange_rate.dig(:rate)
|
|
|
|
|
|
|
|
rate.save! if cache
|
|
|
|
rate
|
|
|
|
rescue ActiveRecord::RecordNotUnique
|
|
|
|
next
|
|
|
|
end
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
2024-07-08 09:04:59 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def fetch_rate_from_provider(from:, to:, date:, cache: false)
|
|
|
|
return nil unless exchange_rates_provider.present?
|
2024-05-27 18:10:28 +02:00
|
|
|
|
2024-03-27 09:16:00 -06:00
|
|
|
response = exchange_rates_provider.fetch_exchange_rate \
|
2024-07-08 09:04:59 -04:00
|
|
|
from: from,
|
|
|
|
to: to,
|
2024-03-27 09:16:00 -06:00
|
|
|
date: date
|
|
|
|
|
|
|
|
if response.success?
|
2024-07-08 09:04:59 -04:00
|
|
|
rate = ExchangeRate.new \
|
|
|
|
from_currency: from,
|
|
|
|
to_currency: to,
|
2024-03-27 09:16:00 -06:00
|
|
|
rate: response.rate,
|
|
|
|
date: date
|
2024-07-08 09:04:59 -04:00
|
|
|
|
2024-10-17 09:52:06 -05:00
|
|
|
if cache
|
|
|
|
rate.save! rescue ActiveRecord::RecordNotUnique
|
|
|
|
end
|
2024-07-08 09:04:59 -04:00
|
|
|
rate
|
2024-03-27 09:16:00 -06:00
|
|
|
else
|
2024-07-08 09:04:59 -04:00
|
|
|
nil
|
2024-03-27 09:16:00 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|