class Skimlinks::MerchantSearch

Constants

ATTRIBUTES
COUNTRY_ALIASES

Public Instance Methods

categories() click to toggle source
# File lib/skimlinks/merchant_search.rb, line 29
def categories
  @categories ||= begin
    flatten = ->(data, prefix = nil) {
      data.each_with_object({}) do |(_, data), hash|
        name       = [prefix, data['name']].compact.join(' > ')
        hash[name] = data['id'].to_i
        hash.merge! flatten.call(data['children'], name) if data['children'].present?
      end
    }

    flatten.call client.merchant_categories
  end
end
merchant(id) click to toggle source
# File lib/skimlinks/merchant_search.rb, line 43
def merchant(id)
  @merchant ||= {}
  @merchant[id] ||= self.merchants.detect { |merchant| merchant.id.to_s == id.to_s }
end
merchants(args = {}) click to toggle source
# File lib/skimlinks/merchant_search.rb, line 48
def merchants(args = {})
  args = args.dup.reverse_merge(
    ATTRIBUTES.each_with_object({}) do |attribute, hash|
      hash[attribute.to_sym] = self.send(attribute) unless self.send(attribute).nil?
    end
  )

  args.assert_valid_keys(ATTRIBUTES.map(&:to_sym))

  raise ArgumentError, "If exclude_no_products is set to true, include_product_count must also be true." if args[:exclude_no_products] && !args[:include_product_count]

  @merchants ||= {}
  @merchants[args] ||= begin
    merchant_data = case
    when args[:query].blank? && args[:category_ids].blank?
      merchants_in_categories(client.merchant_category_ids)
    when args[:query].present? && args[:category_ids].present?
      merchants_in_categories(args[:category_ids]) & client.merchant_search(args[:query])
    when args[:query].present?
      client.merchant_search(args[:query])
    else
      merchants_in_categories(args[:category_ids])
    end

    raise StandardError, "No country aliases for #{args[:country]} found." if args[:country].present? && !COUNTRY_ALIASES.has_key?(args[:country].to_sym)

    if args[:country].present?
      merchant_data.reject! do |merchant|
        merchant['countries'].present? && (COUNTRY_ALIASES[args[:country].to_sym] & merchant['countries']).empty?
      end
    end

    merchants = Merchant.build_from_api_response(merchant_data)

    if args[:include_product_count]
      merchants.each do |merchant|
        merchant.product_count = client.product_count(merchant_id: merchant.id)
      end

      if args[:exclude_no_products]
        merchants.reject! do |merchant|
          merchant.product_count == 0
        end
      end
    end

    merchants
  end
end

Private Instance Methods

merchants_in_categories(category_ids) click to toggle source
# File lib/skimlinks/merchant_search.rb, line 100
def merchants_in_categories(category_ids)
  Array(category_ids).map do |category_id|
    client.merchants_in_category(category_id)
  end.flatten.uniq
end