class Prestashop::Api::Connection

Attributes

api_key[R]
api_url[R]

Public Class Methods

new(api_key, api_url) click to toggle source

Create new connection. Raise error, when is not possible validate connection from any reason

Prestashop::Api::Connection.new 'TOKEN342', 'mystore.com'
# File lib/prestashop/api/connection.rb, line 15
def initialize api_key, api_url
  @api_key = api_key
  self.api_url = api_url

  raise InvalidCredentials unless self.test
end

Public Instance Methods

api_url=(url) click to toggle source

Convert url to suitable for Prestashop API

@connection.api_url = 'mystore.com' # => http://mystore.com/api/
# File lib/prestashop/api/connection.rb, line 26
def api_url= url
  url.gsub!(/^(http|https):\/\//,'')
  url = 'http://' + url
  url << '/' unless url.end_with? '/'
  url << 'api/' unless url.end_with? 'api/'
  @api_url = url
end
check(resource, id = nil)
Alias for: head
connection() click to toggle source

Create connection based on connection instance, returns Faraday::Connection which can be usedo for API call

# File lib/prestashop/api/connection.rb, line 37
def connection
  Faraday.new do |builder|
    builder.url_prefix = api_url
    builder.request     :multipart
    builder.request     :url_encoded
    builder.request     :retry, 5
    # builder.response    :logger
    builder.adapter     :net_http
    builder.basic_auth  api_key, ''
  end
end
create(resource, payload)
Alias for: post
delete(resource, id) click to toggle source

Call DELETE on WebService API, returns true if was request successfull or raise error, when request failed.

delete :customer, 1 # => true
# File lib/prestashop/api/connection.rb, line 175
def delete resource, id
  raise ArgumentError, "resource: #{resource} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)
  raise ArgumentError, "id: #{id} must be integer" unless id.to_i.kind_of?(Integer)

  request_path = path(resource, id)
  response = connection.delete request_path
  if response.success?
    true # response.body
  else
    raise RequestFailed.new(response), response.body.parse_error
  end
rescue ParserError
  raise ParserError, "Response couldn't be parsed for: #{request_path}. RESPONSE: #{response.body} XML SENT: #{payload}"
end
Also aliased as: destroy
destroy(resource, id)
Alias for: delete
get(resource, id = nil, opts = {}) click to toggle source

Call GET on WebService API, returns parsed Prestashop response or raise error, when request failed. Can be called as read instead get

get :customer, 1       # => {id: 1 ...}
read :customer, [1,2]    # => [{id: 1}, {id: 2}]
available options
  • filter

  • display

  • sort

  • limit

  • schema

  • date

# File lib/prestashop/api/connection.rb, line 104
def get resource, id = nil, opts = {}
  id.to_i unless id.kind_of?(Array)
  raise ArgumentError, "resource: #{resource} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)
  raise ArgumentError, "id: #{id} must be integer, array or nil" unless id.kind_of?(Integer) or id.kind_of?(Array) or id == nil

  white_list = %w(filter display sort limit schema date)
  params = {}
  opts.each do |name, value|
    if white_list.include? name.to_s.split('[').first
      params[name.to_sym] = value
    end
  end 

  request_path = path(resource, id)
  response = connection.get request_path, params
  if response.success? 
    response.body.parse
  else
    raise RequestFailed.new(response), response.body.parse_error
  end
rescue ParserError
  raise ParserError, "Response couldn't be parsed for: #{request_path} with #{params}. RESPONSE: #{response.body}"
end
Also aliased as: read
head(resource, id = nil) click to toggle source

Call HEAD on WebService API, returns true if was request successfull or raise error, when request failed. Can be called as check instead head

head :customer, 2 # => true
check :customer, 3 # => true
# File lib/prestashop/api/connection.rb, line 74
def head resource, id = nil
  raise ArgumentError, "resource: #{resource} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)
  raise ArgumentError, "id: #{id} must be integer or nil" unless id.to_i.kind_of?(Integer) or id == nil
  
  request_path = path(resource, id)
  response = connection.head request_path
  if response.success?
    true # response.body
  else
    raise RequestFailed.new(response), response.body.parse_error
  end
rescue ParserError
  raise ParserError, "Response couldn't be parsed for: #{request_path}. RESPONSE: #{response.body}"
end
Also aliased as: check
path(resource, id = nil) click to toggle source

Generate path for API request

path(:customers, 1) # => "customers/1"
path(:customers, [1, 5]) # => "customers?id=[1,5]"
# File lib/prestashop/api/connection.rb, line 54
def path resource, id = nil
  path = resource.to_s
  path += id.kind_of?(Array) ? "?id=[#{id.join(',')}]" : "/#{id}" if id
  path
end
post(resource, payload) click to toggle source

Call POST on WebService API, returns parsed Prestashop response if was request successfull or raise error, when request failed. Can be called as create insted of put

post :customer, { name: 'Steve' } # => true
# File lib/prestashop/api/connection.rb, line 134
def post resource, payload
  raise ArgumentError, "resource: #{resource} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)

  request_path = path(resource)
  response = connection.post request_path, payload
  if response.success? 
    response.body.parse
  else
    raise RequestFailed.new(response), "#{response.body.parse_error}. XML SENT: #{payload}"
  end
rescue ParserError
  raise ParserError, "Response couldn't be parsed for: #{request_path}. RESPONSE: #{response.body} XML SENT: #{payload}"
end
Also aliased as: create
put(resource, id, payload) click to toggle source

Call PUT on WebService API, returns parsed Prestashop response if was request successfull or raise error, when request failed. Can be called as update instead put

put :customer, 1, {surname: 'Jobs'} # => true
update :customer, 1, {nope: 'Jobs'} # => false
# File lib/prestashop/api/connection.rb, line 155
def put resource, id, payload
  raise ArgumentError, "resource: #{resource} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)
  raise ArgumentError, "id: #{id} must be integer" unless id.to_i.kind_of?(Integer)

  request_path = path(resource, id)
  response = connection.put request_path, payload
  if response.success?
    response.body.parse
  else
    raise RequestFailed.new(response), "#{response.body.parse_error}. XML SENT: #{payload}"
  end
rescue ParserError
  raise ParserError, "Response couldn't be parsed for: #{request_path}. RESPONSE: #{response.body} XML SENT: #{payload}"
end
Also aliased as: update
read(resource, id = nil, opts = {})
Alias for: get
test() click to toggle source

Test connection based on current credentials and connection, return true or false, based if request was successfull or not.

# File lib/prestashop/api/connection.rb, line 220
def test
  connection.get.status == 200 ? true : false
end
update(resource, id, payload)
Alias for: put
upload(type, resource, id, payload, file) click to toggle source

Send file via payload After that call POST on WebService API, returns parsed Prestashop response if was request successfull or raise error, when request failed.

upload :image, :customer, 2, {image: '/file/to/path.png'}, file

@param type [Type (image, attachement)] @param resource [Resource of uploaded item] @param id [ID of uploaded item] @param payload [Attachement in hash with file path] @param file [Original file]

# File lib/prestashop/api/connection.rb, line 202
def upload type, resource, id, payload, file
  raise ArgumentError, "type: #{type} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)
  raise ArgumentError, "resource: #{resource} must be string or symbol" unless resource.kind_of?(String) or resource.kind_of?(Symbol)
  raise ArgumentError, "id: #{id} must be integer" unless id.to_i.kind_of?(Integer)

  request_path = upload_path(type, resource, id)
  response = connection.post request_path, payload
  file.destroy!
  if response.success?
    response.body.parse
  else
    raise RequestFailed.new(response), response.body.parse_error
  end
rescue ParserError
  raise ParserError, "Response couldn't be parsed for: #{request_path}. RESPONSE: #{response.body} XML SENT: #{payload}"
end
upload_path(type, resource, id) click to toggle source

Generate path for API upload request

upload_path :image, :products, 2 # => /images/products/2
# File lib/prestashop/api/connection.rb, line 64
def upload_path type, resource, id
  "#{type}/#{resource}/#{id}"
end