48 lines
1.3 KiB
Ruby
48 lines
1.3 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require "json"
|
||
|
|
require "net/http"
|
||
|
|
|
||
|
|
require "provider/adapters/adapter"
|
||
|
|
|
||
|
|
class Provider
|
||
|
|
module Adapters
|
||
|
|
# Croatian National Bank. Fetches daily mid exchange rates (EUR-based)
|
||
|
|
# via the v3 API. Historical HRK rates (pre-2023) are no longer available
|
||
|
|
# as the v2 API was frozen after Croatia adopted the euro.
|
||
|
|
class HNB < Adapter
|
||
|
|
BASE_URL = "https://api.hnb.hr/tecajn-eur/v3"
|
||
|
|
|
||
|
|
class << self
|
||
|
|
def backfill_range = 90
|
||
|
|
end
|
||
|
|
|
||
|
|
def fetch(after: nil, upto: nil)
|
||
|
|
url = URI(BASE_URL)
|
||
|
|
params = {}
|
||
|
|
params["datum-primjene-od"] = after.to_s if after
|
||
|
|
params["datum-primjene-do"] = (upto || Date.today).to_s if after || upto
|
||
|
|
url.query = URI.encode_www_form(params) unless params.empty?
|
||
|
|
|
||
|
|
parse(Net::HTTP.get(url))
|
||
|
|
end
|
||
|
|
|
||
|
|
def parse(json)
|
||
|
|
rows = JSON.parse(json)
|
||
|
|
rows.filter_map do |row|
|
||
|
|
date_str = row["datum_primjene"]
|
||
|
|
rate_str = row["srednji_tecaj"]
|
||
|
|
currency = row["valuta"]
|
||
|
|
next unless date_str && rate_str && currency
|
||
|
|
|
||
|
|
rate_value = Float(rate_str.tr(",", "."))
|
||
|
|
next if rate_value.zero?
|
||
|
|
|
||
|
|
date = Date.parse(date_str)
|
||
|
|
{ date:, base: "EUR", quote: currency, rate: rate_value }
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|