mirror of
https://github.com/we-promise/sure.git
synced 2026-04-14 01:24:06 +00:00
* Initial implementation * Tiingo fixes * Adds 2 providers, remove 2 * Add extra checks * FIX a big hotwire race condition // Fix hotwire_combobox race condition: when typing quickly, a slow response for // an early query (e.g. "A") can overwrite the correct results for the final query // (e.g. "AAPL"). We abort the previous in-flight request whenever a new one fires, // so stale Turbo Stream responses never reach the DOM. * pipelock * Update price_test.rb * Reviews * i8n * fixes * fixes * Update tiingo.rb * fixes * Improvements * Big revamp * optimisations * Update 20260408151837_add_offline_reason_to_securities.rb * Add missing tests, fixes * small rank tests * FIX tests * Update show.html.erb * Update resolver.rb * Update usd_converter.rb * Update holdings_controller.rb * Update holdings_controller.rb * Update holdings_controller.rb * Update holdings_controller.rb * Update holdings_controller.rb * Update _yahoo_finance_settings.html.erb
38 lines
1.6 KiB
Ruby
38 lines
1.6 KiB
Ruby
module Provider::SecurityConcept
|
|
extend ActiveSupport::Concern
|
|
|
|
# NOTE: This `Security` is a lightweight Data value object used for search results.
|
|
# Inside provider classes that `include SecurityConcept`, unqualified `Security`
|
|
# resolves to this Data class — NOT to `::Security` (the ActiveRecord model).
|
|
Security = Data.define(:symbol, :name, :logo_url, :exchange_operating_mic, :country_code, :currency) do
|
|
def initialize(symbol:, name:, logo_url:, exchange_operating_mic:, country_code:, currency: nil)
|
|
super
|
|
end
|
|
end
|
|
SecurityInfo = Data.define(:symbol, :name, :links, :logo_url, :description, :kind, :exchange_operating_mic)
|
|
Price = Data.define(:symbol, :date, :price, :currency, :exchange_operating_mic)
|
|
|
|
def search_securities(symbol, country_code: nil, exchange_operating_mic: nil)
|
|
raise NotImplementedError, "Subclasses must implement #search_securities"
|
|
end
|
|
|
|
def fetch_security_info(symbol:, exchange_operating_mic:)
|
|
raise NotImplementedError, "Subclasses must implement #fetch_security_info"
|
|
end
|
|
|
|
def fetch_security_price(symbol:, exchange_operating_mic:, date:)
|
|
raise NotImplementedError, "Subclasses must implement #fetch_security_price"
|
|
end
|
|
|
|
def fetch_security_prices(symbol:, exchange_operating_mic:, start_date:, end_date:)
|
|
raise NotImplementedError, "Subclasses must implement #fetch_security_prices"
|
|
end
|
|
|
|
# Maximum number of calendar days of historical data the provider can return.
|
|
# Callers should clamp start_date to avoid requesting data beyond this window.
|
|
# Override in subclasses with provider-specific limits.
|
|
def max_history_days
|
|
nil # nil means no known limit
|
|
end
|
|
end
|