49 lines
1.5 KiB
Ruby
49 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "json"
|
|
require "net/http"
|
|
|
|
require "provider/adapters/adapter"
|
|
|
|
class Provider
|
|
module Adapters
|
|
# Banco de la República Colombia. Publishes the daily TRM (Tasa
|
|
# Representativa del Mercado) — the representative market exchange rate
|
|
# for the US dollar against the Colombian peso — via the Socrata Open
|
|
# Data API on datos.gov.co.
|
|
class BANREP < Adapter
|
|
BASE_URL = "https://www.datos.gov.co/resource/32sa-8pi3.json"
|
|
def fetch(after: nil, upto: nil)
|
|
uri = URI(BASE_URL)
|
|
uri.query = URI.encode_www_form(
|
|
"$where" => "vigenciadesde>='#{after}T00:00:00.000' AND vigenciadesde<='#{upto || Date.today}T00:00:00.000'",
|
|
"$limit" => 50_000,
|
|
"$order" => "vigenciadesde ASC",
|
|
)
|
|
|
|
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true, open_timeout: 15, read_timeout: 30) do |http|
|
|
http.request(Net::HTTP::Get.new(uri))
|
|
end
|
|
|
|
parse(response.body)
|
|
end
|
|
|
|
def parse(json)
|
|
records = json.is_a?(String) ? JSON.parse(json) : json
|
|
return [] unless records.is_a?(Array)
|
|
|
|
records.filter_map do |record|
|
|
date_str = record["vigenciadesde"]
|
|
value_str = record["valor"]
|
|
next if date_str.nil? || value_str.nil?
|
|
|
|
date = Date.parse(date_str)
|
|
rate_value = Float(value_str)
|
|
next if rate_value.zero?
|
|
|
|
{ date:, base: "USD", quote: "COP", rate: rate_value }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|