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