Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/beyond_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
require "beyond_api/ext"
require "beyond_api/utils"
require "beyond_api/services/base_service"
require "beyond_api/services/product_management/category"
require "beyond_api/services/product_management/image"
require "beyond_api/services/product_management/product"
require "beyond_api/services/product_management/variation"
Expand Down
34 changes: 34 additions & 0 deletions lib/beyond_api/services/base_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,39 @@ def initialize(session)
# raise InvalidSessionError, "Invalid session" unless session.is_a? BeyondApi::Session
# raise InvalidSessionError, "Session api_url cannot be nil" if session.api_url.nil?
end

def fetch_all_pages(url, resource, params = {})
if params[:paginated] == false
result = fetch_pages(url, resource, params, BeyondApi.configuration.all_pagination_size)
adjust_response(result)
result
else
fetch_page(url, params)
end
end

private

def adjust_response(result)
result[:page][:size] = result[:page][:total_elements]
result[:page][:total_pages] = 1
result[:page][:number] = 0
end

def fetch_page(url, params = {})
BeyondApi::Request.get(@session, url, params)
end

def fetch_pages(url, resource, params, size)
result = fetch_page(url, params.merge(page: 0, size:))

(1..result[:page][:total_pages] - 1).each do |page|
result[:embedded][resource].concat(
fetch_page(url, params.merge(page:, size:))[:embedded][resource]
)
end

result
end
end
end
9 changes: 9 additions & 0 deletions lib/beyond_api/services/product_management/category.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module BeyondApi
module ProductManagement
class Category < BaseService
def find(id)
BeyondApi::Request.get(@session, "/categories/#{id}")
end
end
end
end
5 changes: 5 additions & 0 deletions lib/beyond_api/services/product_management/product.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
module BeyondApi
module ProductManagement
class Product < BaseService
def all(params = {})
# BeyondApi::Request.get(@session, "/products", params)
fetch_all_pages("/products", :products, params)
end

def find(id)
BeyondApi::Request.get(@session, "/products/#{id}")
end
Expand Down
2 changes: 1 addition & 1 deletion lib/beyond_api/services/product_view/category.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module BeyondApi
module ProductView
class Category < BaseService
def all(params = {})
BeyondApi::Request.get(@session, "/product-view/categories", params)
fetch_all_pages("/product-view/categories", :categories, params)
end

def find(id)
Expand Down
83 changes: 0 additions & 83 deletions lib/beyond_api/utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,88 +16,5 @@ def file_content_type(file_path)
"image/gif"
end
end

def handle_all_request(url, resource, params = {})
paginated_size = BeyondApi.configuration.all_pagination_size

if params[:paginated] == false
result = all_paginated(url, params.merge(page: 0, size: paginated_size))

(1..result[:page][:total_pages] - 1).each do |page|
result[:embedded][resource].concat(
all_paginated(url,
params.merge(page: page,
size: paginated_size))[:embedded][resource]
)
end

result[:page][:size] = result[:page][:total_elements]
result[:page][:total_pages] = 1
result[:page][:number] = 0

result
else
all_paginated(url, params)
end
end

def handle_error(response)
raise BeyondApi::Error.new({}, 500)
# BeyondApi.logger.error "[Beyond API] #{status}: #{response}"
# error = BeyondApi::Error.new(response, status)
# BeyondApi.configuration.raise_error_requests ? raise(error) : error
end

def handle_response(response, status, respond_with_true: false)
if status.between?(200, 299)
return true if respond_with_true

response = sanitize_response(response)
BeyondApi.configuration.object_struct_responses ? to_object_struct(response) : response
else
handle_error(response, status)
end
end

def sanitize_key(key)
key.chars.first == "_" ? key[1..-1] : key
end

def sanitize_response(hash)
{}.tap do |h|
hash.each do |key, value|
next if key == "_links" && BeyondApi.configuration.remove_response_links

key = sanitize_key(key) if BeyondApi.configuration.remove_response_key_underscores
h[key.underscore.to_sym] = transform(value)
end
end
end

def to_object_struct(data)
if data.is_a? Hash
OpenStruct.new(data.map { |key, val| [key, to_object_struct(val)] }.to_h)
elsif data.is_a? Array
data.map { |o| to_object_struct(o) }
else
data
end
end

private

def all_paginated(url, params = {})
response, status = BeyondApi::Request.get(@session, url, params)

handle_response(response, status)
end

def transform(thing)
case thing
when Hash then sanitize_response(thing)
when Array then thing.map { |v| transform(v) }
else; thing
end
end
end
end