2024-07-16 09:26:49 -04:00
|
|
|
class Security::Price < ApplicationRecord
|
2024-08-01 19:43:23 -04:00
|
|
|
include Provided
|
|
|
|
|
|
|
|
before_save :upcase_ticker
|
|
|
|
|
|
|
|
validates :ticker, presence: true, uniqueness: { scope: :date, case_sensitive: false }
|
|
|
|
|
|
|
|
class << self
|
|
|
|
def find_price(ticker:, date:, cache: true)
|
|
|
|
result = find_by(ticker:, date:)
|
|
|
|
|
|
|
|
result || fetch_price_from_provider(ticker:, date:, cache:)
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_prices(ticker:, start_date:, end_date: Date.current, cache: true)
|
|
|
|
prices = where(ticker:, date: start_date..end_date).to_a
|
|
|
|
all_dates = (start_date..end_date).to_a.to_set
|
|
|
|
existing_dates = prices.map(&:date).to_set
|
|
|
|
missing_dates = (all_dates - existing_dates).sort
|
|
|
|
|
|
|
|
if missing_dates.any?
|
|
|
|
prices += fetch_prices_from_provider(ticker:, start_date: missing_dates.first, end_date: missing_dates.last, cache:)
|
|
|
|
end
|
|
|
|
|
|
|
|
prices
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
def upcase_ticker
|
|
|
|
self.ticker = ticker.upcase
|
|
|
|
end
|
2024-07-16 09:26:49 -04:00
|
|
|
end
|