Files
sure/app/models/provider/security_concept.rb
soky srm 7908f7d8a4 Expand financial providers (#1407)
* 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
2026-04-09 18:33:59 +02:00

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