61 lines
1.4 KiB
Ruby
61 lines
1.4 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require "net/http"
|
||
|
|
require "oj"
|
||
|
|
|
||
|
|
require "provider/adapters/adapter"
|
||
|
|
|
||
|
|
class Provider
|
||
|
|
module Adapters
|
||
|
|
# National Bank of Georgia. Publishes daily rates for 40+ currencies against GEL.
|
||
|
|
class NBG < Adapter
|
||
|
|
URL = "https://nbg.gov.ge/gw/api/ct/monetarypolicy/currencies/"
|
||
|
|
def fetch(after: nil, upto: nil)
|
||
|
|
end_date = upto || Date.today
|
||
|
|
dataset = []
|
||
|
|
|
||
|
|
first = true
|
||
|
|
(after..end_date).each do |date|
|
||
|
|
next if date.sunday?
|
||
|
|
|
||
|
|
sleep(0.2) unless first
|
||
|
|
first = false
|
||
|
|
|
||
|
|
dataset.concat(fetch_date(date))
|
||
|
|
end
|
||
|
|
|
||
|
|
dataset
|
||
|
|
end
|
||
|
|
|
||
|
|
def parse(json)
|
||
|
|
data = json.is_a?(String) ? Oj.load(json, mode: :strict) : json
|
||
|
|
return [] unless data.is_a?(Array) && data.first
|
||
|
|
|
||
|
|
entry = data.first
|
||
|
|
date = Date.parse(entry["date"])
|
||
|
|
currencies = entry["currencies"] || []
|
||
|
|
|
||
|
|
currencies.filter_map do |cur|
|
||
|
|
code = cur["code"]
|
||
|
|
next unless code&.match?(/\A[A-Z]{3}\z/)
|
||
|
|
|
||
|
|
quantity = cur["quantity"].to_f
|
||
|
|
rate = cur["rate"].to_f
|
||
|
|
next if rate.zero? || quantity.zero?
|
||
|
|
|
||
|
|
{ date:, base: code, quote: "GEL", rate: rate / quantity }
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def fetch_date(date)
|
||
|
|
url = URI(URL)
|
||
|
|
url.query = URI.encode_www_form(date: date.strftime("%Y-%m-%d"))
|
||
|
|
response = Net::HTTP.get(url)
|
||
|
|
parse(response)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|