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: 0 additions & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require:
- rubocop-ordered_methods
- rubocop-rspec

AllCops:
Expand Down
52 changes: 52 additions & 0 deletions lib/beyond_api/all_pages_handler.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
module BeyondApi
class AllPagesHandler
include Concerns::Connection

def initialize(session, url, params = {})
@session = session
@url = url
@params = params

first_page_data = fetch_page(0)
@response = first_page_data
@resource_key = first_page_data[:embedded].keys.first
@total_pages = first_page_data.dig(:page, :total_pages)
@total_elements = first_page_data.dig(:page, :total_elements)
end

def call
(1..remaining_pages).each do |page|
process_page(page)
end

update_response_page_info

@response
end

private

def remaining_pages
@total_pages - 1
end

def fetch_page(page)
# Fixed page size
get(@url, @params.merge(page:, size: BeyondApi.configuration.all_pagination_size))
end

def process_page(page)
page_data = fetch_page(page)

@response[:embedded][@resource_key].concat(
page_data[:embedded][@resource_key]
)
end

def update_response_page_info
@response[:page][:size] = @total_elements
@response[:page][:total_pages] = 1
@response[:page][:number] = 0
end
end
end
81 changes: 81 additions & 0 deletions lib/beyond_api/concerns/connection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# frozen_string_literal: true

module BeyondApi
module Concerns
module Connection
LOGGER = BeyondApi.logger
LOGGER.level = Kernel.const_get("::Logger::#{BeyondApi.configuration.log_level.to_s.upcase}")

def get(path, params = {})
parsed_response agent.get(path, params)
end

def post(path, body = {}, params = {})
response = agent.post(path, body) do |request|
request.params = params
request.body = parsed_body(body)
end
parsed_response(response)
end

def delete(path, params = {})
parsed_response agent.delete(path, params)
end

private

def parsed_response(response)
Response.new(response).handle
end

def parsed_body(body)
Utils.camelize_keys(body)
end

def agent
@agent ||= Faraday.new(url: @session.api_url, ssl: { verify: true }) do |faraday|
# Timeouts
faraday.options.timeout = BeyondApi.configuration.timeout.to_i
faraday.options.open_timeout = BeyondApi.configuration.open_timeout.to_i
# Authorization
case @authorization
when :basic
faraday.request :authorization, :basic, BeyondApi.configuration.client_id,
BeyondApi.configuration.client_secret
when :bearer
faraday.request :authorization, "Bearer", @session.access_token
end
# Headers
faraday.headers["Accept"] = "application/json" # Set default accept header
faraday.headers["Content-Type"] = "application/json" # Set default content type
# Request options
faraday.request :json # Encode request bodies as JSON
faraday.request :retry, BeyondApi.configuration.retry_options
# Response options
faraday.response :json, content_type: "application/json"
faraday.response :logger, *logger_config { |logger| apply_filters(logger) }
end
end

def apply_filters(logger)
logger.filter(/(code=)([a-zA-Z0-9]+)/, '\1[FILTERED]')
logger.filter(/(refresh_token=)([a-zA-Z0-9.\-\_]+)/, '\1[FILTERED]')
end

# def multipart
# create_connection do |faraday|
# faraday.adapter Faraday.default_adapter
# faraday.request :multipart, flat_encode: true
# end
# end

def logger_config
[
LOGGER,
{ bodies: BeyondApi.configuration.log_bodies,
headers: BeyondApi.configuration.log_headers }
]
end
end
end
end
15 changes: 15 additions & 0 deletions lib/beyond_api/concerns/pagination.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

module BeyondApi
module Concerns
module Pagination
def fetch_all_pages(url, params = {})
if params[:paginated] == false
AllPagesHandler.new(@session, url, params).call
else
get(url, params)
end
end
end
end
end
78 changes: 0 additions & 78 deletions lib/beyond_api/connection.rb

This file was deleted.

2 changes: 1 addition & 1 deletion lib/beyond_api/services/authentication/token.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module BeyondApi
module Authentication
class Token
include Connection # @session, @authorization
include Concerns::Connection # @session, @authorization

def initialize(session = nil)
@session = session
Expand Down
37 changes: 2 additions & 35 deletions lib/beyond_api/services/base_service.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module BeyondApi
class BaseService
include Connection # @session, @authorization
include Concerns::Connection # @session, @authorization
include Concerns::Pagination

ServiceSession = Struct.new(:api_url, :access_token, :refresh_token)

Expand All @@ -9,16 +10,6 @@ def initialize(**params)
@authorization = :bearer
end

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

private

def initialize_session(session)
Expand All @@ -28,29 +19,5 @@ def initialize_session(session)
session[:refresh_token]
)
end

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

# FIXME: find another way
def fetch_page(url, page, params = {})
params.merge!(page:, size: BeyondApi.configuration.all_pagination_size)
BeyondApi::Request.new(@session).get(url, params)
end

def fetch_pages(url, resource, params)
result = fetch_page(url, 0, params)

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

result
end
end
end
2 changes: 1 addition & 1 deletion lib/beyond_api/services/product_management/image.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module BeyondApi
module ProductManagement
class Image < BaseService
def all(id)
def all(id, params = {})
get("products/#{id}/images")
end
end
Expand Down
4 changes: 1 addition & 3 deletions lib/beyond_api/services/product_management/product.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ module BeyondApi
module ProductManagement
class Product < BaseService
def all(params = {})
# Request.new(@session).get("products", params)
# fetch_all_pages("/products", :products, params)
get("products", params)
fetch_all_pages("/products", params)
end

def find(id)
Expand Down
2 changes: 1 addition & 1 deletion lib/beyond_api/services/product_management/variation.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module BeyondApi
module ProductManagement
class Variation < BaseService
def all(id)
def all(id, params = {})
get("products/#{id}/variations")
end
end
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module BeyondApi
module ProductManagement
class VariationImage < BaseService
def all(product_id, variation_id)
def all(product_id, variation_id, params = {})
get("products/#{product_id}/variations/#{variation_id}/images")
end
end
Expand Down
3 changes: 1 addition & 2 deletions lib/beyond_api/services/product_view/category.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ module BeyondApi
module ProductView
class Category < BaseService
def all(params = {})
# fetch_all_pages("product-view/categories", :categories, params)
get("product-view/categories", params)
fetch_all_pages("product-view/categories", params)
end

def find(id)
Expand Down