class GunBroker::User::OrdersDelegate

Used to scope {Order} actions by {User}.

Public Class Methods

new(user) click to toggle source

@param user [User] A {User} instance to scope orders by.

# File lib/gun_broker/user/orders_delegate.rb, line 13
def initialize(user)
  @user = user
end

Public Instance Methods

find(order_id) click to toggle source

Finds a specific User's Order by ID. Calls {Order.find} to get full Order details. @raise (see sold) @return [Order] Returns the Order or `nil` if no Order found.

# File lib/gun_broker/user/orders_delegate.rb, line 20
def find(order_id)
  GunBroker::Order.find(order_id, {}, token_header(@user.token))
end
find!(order_id) click to toggle source

Same as {#find} but raises GunBroker::Error::NotFound if no order is found. @raise [GunBroker::Error::NotFound] If the User has no Order with `order_id`. @return [Order] Returns the Order.

# File lib/gun_broker/user/orders_delegate.rb, line 27
def find!(order_id)
  order = find(order_id)
  raise GunBroker::Error::NotFound.new("Couldn't find order with ID '#{order_id}'") if order.nil?
  order
end
set_flags!(order_id, flags = {}) click to toggle source

Sets any of 3 available Order flags. @param order_id [Integer, String] ID of the Order to update. @param flags [hash] Keys with boolean values of flags to update on Order. @raise [GunBroker::Error::NotAuthorized] If the {User#token `@user` token} isn't valid. @raise [GunBroker::Error::RequestError] If the Order attributes are not valid or required attributes are missing. @return [GunBroker::Order] The updated Order instance.

# File lib/gun_broker/user/orders_delegate.rb, line 79
def set_flags!(order_id, flags = {})
  unless flags.keys.all? { |k| ACCEPTED_FLAG_KEYS.include?(k) }
    raise ArgumentError.new("Only accepted keys for flag toggling are #{ACCEPTED_FLAG_KEYS.to_sentence}")
  end

  params = {
    'PaymentReceived' => flags[:payment_received],
    'FFLReceived'     => flags[:ffl_received],
    'OrderShipped'    => flags[:order_shipped],
  }

  GunBroker::API.put("/Orders/#{order_id}/Flags", cleanup_nil_params(params), token_header(@user.token))
  find!(order_id)
end
sold(options = {}) click to toggle source

Sold Orders for the User. @param options [Hash] {ItemID=>ItemID} @note {API#get! GET} /OrdersSold @return [Array<Order>]

# File lib/gun_broker/user/orders_delegate.rb, line 37
def sold(options = {})
  params = [
    *params_for(:timeframe),
    *params_for(:itemid, options)
  ].to_h

  @sold ||= fetch_orders(:OrdersSold, params)
end
submit_shipping(*args) click to toggle source

Submits shipping details for an {Order}. @param (see submit_shipping!) @return [GunBroker::Order] The updated Order instance or `false` if update fails.

# File lib/gun_broker/user/orders_delegate.rb, line 49
def submit_shipping(*args)
  submit_shipping!(*args)
rescue GunBroker::Error
  false
end
submit_shipping!(order_id, tracking_number, carrier_name) click to toggle source

Same as {#submit_shipping} but raises exceptions on error. @param order_id [Integer, String] ID of the Order to update. @param tracking_number [String] The tracking number of the shipment. @param carrier_name [String] The name of the carrier of the shipment. @raise [GunBroker::Error::NotAuthorized] If the {User#token `@user` token} isn't valid. @raise [GunBroker::Error::RequestError] If the Order attributes are not valid or required attributes are missing. @return [GunBroker::Order] The updated Order instance.

# File lib/gun_broker/user/orders_delegate.rb, line 62
def submit_shipping!(order_id, tracking_number, carrier_name)
  carrier_key = SHIPPING_CARRIERS.find { |k, v| v.casecmp(carrier_name).zero? }.try(:first)
  params = {
    'TrackingNumber' => tracking_number,
    'Carrier'        => carrier_key,
  }

  GunBroker::API.put("/Orders/#{order_id}/Shipping", cleanup_nil_params(params), token_header(@user.token))
  find!(order_id)
end

Private Instance Methods

cleanup_nil_params(params) click to toggle source
# File lib/gun_broker/user/orders_delegate.rb, line 138
def cleanup_nil_params(params)
  params.delete_if { |k, v| v.nil? }
end
fetch_orders(endpoint, params = {}) click to toggle source
# File lib/gun_broker/user/orders_delegate.rb, line 96
def fetch_orders(endpoint, params = {})
  cleanup_nil_params(params)
  params.merge!('PageSize' => GunBroker::API::PAGE_SIZE)

  endpoint = ['/', endpoint.to_s].join
  response = GunBroker::API.get(endpoint, params, token_header(@user.token))
  number_of_pages = (response['count'] / GunBroker::API::PAGE_SIZE.to_f).ceil

  if number_of_pages > 1
    _orders_from_results = orders_from_results(response['results'])

    number_of_pages.times do |page_number|
      page_number += 1
      next if page_number == 1

      params.merge!({ 'PageIndex' => page_number })
      response = GunBroker::API.get(endpoint, params, token_header(@user.token))
      _orders_from_results.concat(orders_from_results(response['results']))
    end

    _orders_from_results
  else
    orders_from_results(response['results'])
  end
end
orders_from_results(results) click to toggle source
# File lib/gun_broker/user/orders_delegate.rb, line 122
def orders_from_results(results)
  # TODO: Ignore non-US orders.
  results.map { |result| GunBroker::Order.new(result) }
end
params_for(key, options = {}) click to toggle source
# File lib/gun_broker/user/orders_delegate.rb, line 127
def params_for(key, options = {})
  case key
  when :timeframe
    { 'TimeFrame' => GunBroker::API::MAX_ORDERS_TIME_FRAME }
  when :itemid
    { 'ItemID' => (options[:item_id] || options["ItemID"]) }
  else
    raise GunBroker::Error.new 'Unrecognized `params_for` key.'
  end
end