module Lucid::Shopify::Resource::Read

@example

class OrderRepository
  include Lucid::Shopify::Resource::Read

  resource :orders

  default_params fields: %w[id tags]

  # ...
end

Public Class Methods

included(base) click to toggle source

@param base [Class, Module]

# File lib/lucid/shopify/resource/read.rb, line 35
def self.included(base)
  base.extend(ClassMethods)
  base.include(Base)
end

Public Instance Methods

count(credentials, params = {}) click to toggle source

@param credentials [Credentials] @param params [Hash]

@return [Integer]

# File lib/lucid/shopify/resource/read.rb, line 116
def count(credentials, params = {})
  params = finalise_params(params)

  logger.info("Fetching #{resource} count")

  client.get(credentials, "#{resource}/count", params)['count']
end
default_params() click to toggle source

@abstract Use {ClassMethods#default_params} to implement (optional)

@return [Hash]

# File lib/lucid/shopify/resource/read.rb, line 43
def default_params
  {}
end
default_shopify_params() click to toggle source

Defaults set by Shopify when not specified.

@return [Hash]

# File lib/lucid/shopify/resource/read.rb, line 50
def default_shopify_params
  {
    limit: 50,
  }
end
each(credentials, params = {}) { |result| ... } click to toggle source

Iterate over results. If set, the 'fields' option must include 'id'. We would not need this if we used offset pagination, but offset pagination is unreliable.

Throttling is always enabled.

@param credentials [Credentials] @param params [Hash]

@yield [Hash]

@return [Enumerator]

@raise [ArgumentError] if 'fields' does not include 'id'

# File lib/lucid/shopify/resource/read.rb, line 83
def each(credentials, params = {})
  return to_enum(__method__, credentials, params) unless block_given?

  assert_fields_id!(params = finalise_params(params))

  since_id = params.delete('since_id') || 1

  loop do
    logger.info("Fetching #{resource} since_id=#{since_id}")

    results = client.get(credentials, resource, params.merge(since_id: since_id))[resource]
    results.each do |result|
      yield result
    end

    break if results.empty?

    since_id = results.last['id']
  end
end
find(credentials, id, params = {}) click to toggle source

@param credentials [Credentials] @param id [Integer] @param params [Hash]

@return [Hash]

# File lib/lucid/shopify/resource/read.rb, line 61
def find(credentials, id, params = {})
  params = finalise_params(params)

  logger.info("Fetching #{resource_singular} id=#{id}")

  client.get(credentials, "#{resource}/#{id}", params)[resource_singular]
end

Private Instance Methods

assert_fields_id!(params) click to toggle source

@param params [Hash] the finalised params (see {#finalise_params})

# File lib/lucid/shopify/resource/read.rb, line 105
        def assert_fields_id!(params)
  return unless params['fields']
  return unless params['fields'] !~ /\bid\b/

  raise ArgumentError, 'attempt to paginate without id field'
end
finalise_params(params) click to toggle source

Merge with default params and format for query string.

@param params [Hash]

@return [Hash]

# File lib/lucid/shopify/resource/read.rb, line 129
        def finalise_params(params)
  params = default_shopify_params.merge(default_params).merge(params)

  params.each_with_object({}) do |(k, v), h|
    k = k.to_s
    k == 'fields' && v.is_a?(Array) ? v.join(',') : v
    h[k] = v
  end
end