class Shoptet

Constants

ADDON_NOT_INSTALLED
EXPIRED_TOKEN_CODE
INVALID_TOKEN_CODE
ON_TOKEN_ERROR

Attributes

api_token[RW]

Public Class Methods

ar_on_token_error(model) click to toggle source
# File lib/shoptet.rb, line 31
def self.ar_on_token_error(model)
  -> (api) do
    model.with_lock do
      model.reload

      if model.api_token != api.api_token
        api.api_token = model.api_token
      else
        new_token = api.new_api_token
        api.api_token = new_token
        model.api_token = new_token
        model.save!
      end
    end
  end
end
basic_eshop(url, access_token) click to toggle source
# File lib/shoptet.rb, line 74
def self.basic_eshop url, access_token
  Shoptet::Request.get(url, { 'Authorization' => "Bearer #{access_token}" })
end
install(url, redirect_url, client_id, client_secret, code) click to toggle source
# File lib/shoptet.rb, line 48
def self.install url, redirect_url, client_id, client_secret, code
  data = {
    'redirect_uri' => redirect_url,
    'client_id' => client_id,
    'client_secret' => client_secret,
    'code' => code,
    'grant_type' => 'authorization_code',
    'scope' => 'api'
  }

  Shoptet::Request.post(url, data)
end
login_token(url, code, client_id, client_secret, redirect_url) click to toggle source
# File lib/shoptet.rb, line 61
def self.login_token url, code, client_id, client_secret, redirect_url
  data = {
    code: code,
    grant_type: 'authorization_code',
    client_id: client_id,
    client_secret: client_secret,
    redirect_uri: redirect_url,
    scope: 'basic_eshop'
  }

  Shoptet::Request.post(url, data)
end
new(oauth_url:, oauth_token:, shop_url:, client_id:, api_token: nil, on_token_error: nil) click to toggle source
# File lib/shoptet.rb, line 80
def initialize oauth_url:, oauth_token:, shop_url:, client_id:, api_token: nil, on_token_error: nil
  @oauth_url = oauth_url
  @oauth_token = oauth_token
  @shop_url = shop_url
  @client_id = client_id
  @api_token = api_token
  @on_token_error = on_token_error || ON_TOKEN_ERROR
end
version() click to toggle source
# File lib/shoptet.rb, line 27
def self.version
  '0.0.35'
end

Public Instance Methods

authorize_url(redirect_url, state) click to toggle source
# File lib/shoptet.rb, line 103
def authorize_url redirect_url, state
  query = {
    client_id: @client_id,
    state: state,
    scope: 'basic_eshop',
    response_type: 'code',
    redirect_uri: redirect_url
  }.to_query

  URI("#{@shop_url}action/OAuthServer/authorize?#{query}")
end
delete(url, retry_on_token_error = true) click to toggle source
# File lib/shoptet.rb, line 247
def delete(url, retry_on_token_error = true)
  url = URI(url)
  headers = { 'Shoptet-Access-Token' => @api_token,
              'Content-Type' => 'application/vnd.shoptet.v1.0' }
  result = Shoptet::Request.delete(url, headers)
  token_errors = handle_errors(result)

  if token_errors.any?
    if retry_on_token_error
      @on_token_error.call(self)
      delete(url, false)
    else
      raise Error.new(result)
    end
  else
    result
  end
end
delete_template(location) click to toggle source
# File lib/shoptet.rb, line 192
def delete_template(location)
  result = delete("https://api.myshoptet.com/api/template-include/#{location}")
  result['data']
end
design_info(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 120
def design_info api_params = {}
  result = get('https://api.myshoptet.com/api/eshop/design', api_params)

  result['data']
end
endpoint_approved?(endpoint) click to toggle source
# File lib/shoptet.rb, line 93
def endpoint_approved? endpoint
  @approved_endpoints ||= endpoints

  @approved_endpoints.any? { _1['endpoint'] == endpoint }
end
endpoints(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 89
def endpoints api_params = {}
  enumerize('https://api.myshoptet.com/api/system/endpoints', api_params)
end
endpoints_approved?(*endpoints_to_check) click to toggle source
# File lib/shoptet.rb, line 99
def endpoints_approved? *endpoints_to_check
  endpoints_to_check.all? { endpoint_approved? _1 }
end
get(url, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 206
def get url, api_params = {}, retry_on_token_error = true
  url = URI(url)
  url.query = URI.encode_www_form(api_params) if api_params.any?

  headers = { 'Shoptet-Access-Token' => @api_token,
              'Content-Type' => 'application/vnd.shoptet.v1.0' }

  result = Shoptet::Request.get(url, headers)
  token_errors = handle_errors(result)

  if token_errors.any?
    if retry_on_token_error
      @on_token_error.call(self)
      get(url, api_params, false)
    else
      raise Error.new(result)
    end
  else
    result
  end
end
new_api_token() click to toggle source
# File lib/shoptet.rb, line 197
def new_api_token
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }

  result = Shoptet::Request.get(URI(@oauth_url), headers)
  handle_errors(result)

  result.fetch('access_token')
end
order(code, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 167
def order code, api_params = {}
  result = get("https://api.myshoptet.com/api/orders/#{code}", api_params)
  result.dig('data', 'order')
end
orders(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 158
def orders api_params = {}
  enumerize('https://api.myshoptet.com/api/orders', api_params)
end
orders_changes(from: api_params = { from: from.iso8601 }) click to toggle source
# File lib/shoptet.rb, line 162
def orders_changes from:
  api_params = { from: from.iso8601 }
  enumerize('https://api.myshoptet.com/api/orders/changes', api_params)
end
post_binary(url, data, retry_on_token_error = true) click to toggle source
# File lib/shoptet.rb, line 228
def post_binary(url, data, retry_on_token_error = true)
  url = URI(url)
  headers = { 'Shoptet-Access-Token' => @api_token,
              'Content-Type' => 'application/vnd.shoptet.v1.0' }
  result = Shoptet::Request.post_binary(url, data, headers)
  token_errors = handle_errors(result)

  if token_errors.any?
    if retry_on_token_error
      @on_token_error.call(self)
      post_binary(url, data, false)
    else
      raise Error.new(result)
    end
  else
    result
  end
end
price_lists(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 150
def price_lists api_params = {}
  enumerize('https://api.myshoptet.com/api/pricelists', api_params)
end
prices(price_list_id, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 154
def prices price_list_id, api_params = {}
  enumerize("https://api.myshoptet.com/api/pricelists/#{price_list_id}", api_params, 'pricelist')
end
product(guid, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 172
def product guid, api_params = {}
  result = get("https://api.myshoptet.com/api/products/#{guid}", api_params)
  result['data']
end
product_by_code(code, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 177
def product_by_code code, api_params = {}
  result = get("https://api.myshoptet.com/api/products/code/#{code}", api_params)
  result['data']
end
product_categories(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 142
def product_categories api_params = {}
  enumerize('https://api.myshoptet.com/api/categories', api_params)
end
products(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 130
def products api_params = {}
  enumerize("https://api.myshoptet.com/api/products", api_params)
end
products_changes(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 146
def products_changes api_params = {}
  enumerize('https://api.myshoptet.com/api/products/changes', api_params)
end
set_templates(data) click to toggle source
# File lib/shoptet.rb, line 187
def set_templates(data)
  result = post_binary('https://api.myshoptet.com/api/template-include', data)
  result['data']
end
shop_info(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 115
def shop_info api_params = {}
  result = get('https://api.myshoptet.com/api/eshop', api_params)
  result['data']
end
stocks(api_params = {}) click to toggle source
# File lib/shoptet.rb, line 126
def stocks api_params = {}
  enumerize('https://api.myshoptet.com/api/stocks', api_params)
end
stocks_movements(warehouse_id, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 138
def stocks_movements warehouse_id, api_params = {}
  enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements", api_params)
end
supplies(warehouse_id, api_params = {}) click to toggle source
# File lib/shoptet.rb, line 134
def supplies warehouse_id, api_params = {}
  enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies", api_params)
end
suspended?() click to toggle source
# File lib/shoptet.rb, line 266
def suspended?
  false if shop_info
rescue Shoptet::AddonSuspended
  true
end
template_includes() click to toggle source
# File lib/shoptet.rb, line 182
def template_includes
  result = get('https://api.myshoptet.com/api/template-include')
  result['data']
end

Private Instance Methods

enumerize(base_url, filters = {}) click to toggle source
# File lib/shoptet.rb, line 274
def enumerize base_url, filters = {}, data_key = nil
  ApiEnumerator.new(base_url, filters, data_key, self)
end
handle_errors(result) click to toggle source
# File lib/shoptet.rb, line 278
def handle_errors result
  error = result['error']
  errors = result['errors'] || []
  token_errors, non_token_errors = errors.partition do |err|
    code = err['errorCode']
    message = err['message']

    code == EXPIRED_TOKEN_CODE ||
      code == INVALID_TOKEN_CODE && (message.include?('Invalid access token') || message.include?('Missing access token'))
  end

  if error || non_token_errors.any?
    if error == 'addon_suspended' || errors.any? { |e| e["errorCode"] == INVALID_TOKEN_CODE && e['message'] == ADDON_NOT_INSTALLED }
      raise AddonSuspended
    elsif (error == 'addon_not_installed')
      raise AddonNotInstalled
    elsif errors.any? { |err| err["errorCode"] == 'invalid-token-no-rights' }
      raise InvalidTokenNoRights
    elsif errors.any? { |err| err["errorCode"] == 'stock-not-found' }
      raise StockNotFound
    elsif errors.any? { |err| err["errorCode"] == 'product-not-found' }
      raise ProductNotFound
    elsif errors.any? { |err| err["errorCode"] == 'system-maintenance' }
      raise SystemMaintenance
    elsif errors.any? { |err| err["errorCode"] == 'unknown-error' }
      raise UnknownError
    elsif errors.any? { |err| err["errorCode"] == 'page-not-found' && err['message'].include?('max page is') }
      raise MaxPageReached
    else
      raise Error.new result
    end
  end

  token_errors
end