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
@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
@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
@abstract Use {ClassMethods#default_params} to implement (optional)
@return [Hash]
# File lib/lucid/shopify/resource/read.rb, line 43 def default_params {} end
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
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
@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
@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
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