class PrestaShop::API

Each instance represents a Prestashop API instance.

Constants

XPATH_MAP

Attributes

api_uri[R]

@return [String] URI of the Prestashop API

client[R]
key[R]

@return [String] API key

Public Class Methods

new(url, key) click to toggle source

Create a new instance @param url [String] base URL of the Prestashop installation. Do not append “/api” to it, the gem does it internally.

E.g. use "http://my.prestashop.com", not "http://my.prestashop.com/api"

@param key [String] a valid API key

# File lib/presta_shop/api.rb, line 43
def initialize(url, key)
  @api_uri = UriHandler.api_uri url
  @key = key
  @client = RestClient::Resource.new api_uri, user: key, password: ''
end
normalize_resource(resource) click to toggle source
# File lib/presta_shop/api.rb, line 32
def normalize_resource(resource)
  resource = resource.to_s.pluralize.to_sym
  resource = resource.to_s.singularize.to_sym if [:order_slips, :content_management_systems].include?(resource)
  resource
end

Public Instance Methods

get(resource, *args) click to toggle source

# # THIS NEEDS TO BE A NEW REQUESTOR TYPE # # api.images.find(‘general/header’) << this works def image(*image_path)

client[([:images]+image_path).join('/')].get.body

end

# File lib/presta_shop/api.rb, line 61
def get(resource, *args)
  resource = normalize_resource(resource)
  raise RestClient::MethodNotAllowed unless resources.include?(resource)
  return image(*args) if resource == :images

  ids = extract_ids(args)
  params = extract_params(args)

  case ids
  when Array then get_resources(resource, ids, params)
  when NilClass then get_resource_ids(resource, params)
  when /^schema$/, /^synopsis$/ then generate_resource_object(resource, nil, params.merge({schema: :synopsis}))
  when /^blank$/ then generate_resource_object(resource, nil, params.merge({schema: :blank}), resource_class(resource))
  else get_resource(resource, ids, params, true)
  end
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/presta_shop/api.rb, line 78
def method_missing(method, *args, &block)
  if resources.include?(resource = normalize_resource(method))
    resource_requestor(resource)
  else
    super
  end
end
resources() click to toggle source

List resources that the API key can access @return [Array<Symbol>] list of resources the API can access

# File lib/presta_shop/api.rb, line 51
def resources
  @resources ||= Nokogiri::XML(client.get.body).xpath('/prestashop/api/*').collect { |resource| resource.name.to_sym }
end

Private Instance Methods

build_query_params(params) click to toggle source
# File lib/presta_shop/api.rb, line 119
def build_query_params(params)
  "?#{params.to_query}" if params.any?
end
extract_ids(args) click to toggle source
# File lib/presta_shop/api.rb, line 123
def extract_ids(args)
  ids = args.dup
  ids.pop if ids.last.is_a? Hash
  ids = ids.first if ids.one? || ids.none?
  raise ArgumentError, 'invalid arguments' unless [NilClass, Numeric, String, Symbol, Array].any? { |klass| ids.is_a? klass }
  raise ArgumentError, 'invalid arguments' unless Array(ids).all? { |id| [Numeric, String, Symbol].any? { |klass| id.is_a? klass } }
  ids
end
extract_params(args) click to toggle source
# File lib/presta_shop/api.rb, line 132
def extract_params(args)
  args.last.is_a?(Hash) ? args.last : {}
end
generate_resource_object(resource, id, params = {}, object_class = OpenStruct, object_schema = nil) click to toggle source
# File lib/presta_shop/api.rb, line 154
def generate_resource_object(resource, id, params = {}, object_class = OpenStruct, object_schema = nil)
  xpath = XPATH_MAP.dig(resource, :find) || resource.to_s.singularize
  xml_response = Nokogiri::XML(client[resource][id][build_query_params(params)].get.body).remove_namespaces!.xpath("/prestashop/#{xpath}")
  resource_object = JSON.parse(Hash.from_xml(xml_response.to_s).values.first.to_json, object_class: object_class)
  resource_object.xml = xml_response
  resource_object.schema_synopsis = object_schema
  resource_object
end
get_resource(resource, id, params, raise_not_found_exception = false) click to toggle source
# File lib/presta_shop/api.rb, line 141
def get_resource(resource, id, params, raise_not_found_exception = false)
  begin
    generate_resource_object(resource, id, params, resource_class(resource), schema(resource))
  rescue RestClient::NotFound
    raise if raise_not_found_exception
    nil
  end
end
get_resource_ids(resource, params) click to toggle source
# File lib/presta_shop/api.rb, line 136
def get_resource_ids(resource, params)
  xpath = XPATH_MAP.dig(resource, :list) || resource
  Nokogiri::XML(client[resource][build_query_params(params)].get.body).xpath("/prestashop/#{xpath}/*/@id").collect(&:value)
end
get_resources(resource, ids, params = {}) click to toggle source
# File lib/presta_shop/api.rb, line 150
def get_resources(resource, ids, params = {})
  ids.uniq.sort.collect { |id| get_resource(resource, id, params) }.compact
end
normalize_resource(resource) click to toggle source
# File lib/presta_shop/api.rb, line 115
def normalize_resource(resource)
  self.class.normalize_resource(resource)
end
resource_class(resource) click to toggle source
# File lib/presta_shop/api.rb, line 88
def resource_class(resource)
  resource_class_name = resource.to_s.classify
  "PrestaShop::#{resource_class_name}".safe_constantize || PrestaShop.const_set(resource_class_name, Class.new(PrestaShop::Resource))
end
resource_language(language_id) click to toggle source
# File lib/presta_shop/api.rb, line 107
def resource_language(language_id)
  resource_languages.include?(language_id) ? resource_languages[language_id] ||= get(:languages, language_id).name : language_id
end
resource_languages() click to toggle source
# File lib/presta_shop/api.rb, line 103
def resource_languages
  @resource_languages ||= resources.include?(:languages) ? get(:languages).zip({}).to_h : {}
end
resource_requestor(resource) click to toggle source
# File lib/presta_shop/api.rb, line 97
def resource_requestor(resource)
  resource = normalize_resource(resource)
  resource_requestors[resource] ||= ("PrestaShop::Requestor::#{resource.to_s.classify}".safe_constantize || PrestaShop::Requestor).new(
    api: self, resource_name: resource, schema: generate_resource_object(resource, nil, {schema: :synopsis}))
end
resource_requestors() click to toggle source
# File lib/presta_shop/api.rb, line 93
def resource_requestors
  @resource_requestors ||= resources.zip({}).to_h
end
schema(resource) click to toggle source
# File lib/presta_shop/api.rb, line 111
def schema(resource)
  resource_requestor(resource).schema
end