class Ingenico::Direct::SDK::ApiResource

Base class of all Ingenico ePayments platform API resources. Provides shared functionality to facilitate communication with the Ingenico ePayments platform.

@attr_reader [Ingenico::Direct::SDK::Communicator] communicator Communicator instance that provides communication with the Ingenico ePayments platform. @attr_reader [String] client_meta_info JSON string containing client info specific to the current client.

Attributes

client_meta_info[R]
communicator[R]

Public Class Methods

new(arg, path_context = nil, client_meta_info = false) click to toggle source

Creates a new ApiResource.

@param arg [Ingenico::Direct::SDK::ApiResource, Ingenico::Direct::SDK::Communicator] parent class or Communicator instance.

If a parent class is given its communicator will be used for communication.

@param path_context [Hash, nil] hash that contains substitutions for generic locations in the URL path.

This hash will be used to instantiate a concrete URL used to access specific resources.
For example in the URL https://payment.preprod.direct.ingenico.com/!{version}/!{merchantId}/payments
!{version} and !{merchantId} can be instantiated using the hash
!{'version' => 'v2', 'merchantId' => '1'}. The final URL in this case will be
https://payment.preprod.direct.ingenico.com/v2/1/payments.

@param client_meta_info [String, nil] JSON string containing the meta data for the client.

# File lib/ingenico/direct/sdk/api_resource.rb, line 23
def initialize(arg, path_context = nil, client_meta_info = false)
  if client_meta_info == false
    raise ArgumentError, 'parent is required' unless arg

    @parent = arg
    @communicator = arg.communicator
    @client_meta_info = arg.client_meta_info
  else
    raise ArgumentError, 'communicator is required' unless arg

    @parent = nil
    @communicator = arg
    @client_meta_info = client_meta_info
  end
  @path_context = path_context
end

Protected Instance Methods

client_headers() click to toggle source

@return [Array<Ingenico::Direct::SDK::RequestHeader>, nil] the X-GCS-ClientMetaInfo header.

# File lib/ingenico/direct/sdk/api_resource.rb, line 46
def client_headers
  @client_meta_info ?
    [RequestHeader.new('X-GCS-ClientMetaInfo', @client_meta_info)] :
    nil
end
create_exception(status_code, response_body, error_object, context) click to toggle source
# File lib/ingenico/direct/sdk/api_resource.rb, line 58
def create_exception(status_code, response_body, error_object, context)
  if error_object.nil?
    error_id = nil
    errors = []
  elsif error_object.is_a?(Ingenico::Direct::SDK::Domain::PaymentErrorResponse) && error_object.payment_result
    return DeclinedPaymentException.new(status_code, response_body, error_object)
  elsif error_object.is_a?(Ingenico::Direct::SDK::Domain::PayoutErrorResponse) && error_object.payout_result
    return DeclinedPayoutException.new(status_code, response_body, error_object)
  elsif error_object.is_a?(Ingenico::Direct::SDK::Domain::RefundErrorResponse) && error_object.refund_result
    return DeclinedRefundException.new(status_code, response_body, error_object)
  elsif error_object.is_a?(Ingenico::Direct::SDK::Domain::PaymentErrorResponse) ||
      error_object.is_a?(Ingenico::Direct::SDK::Domain::PayoutErrorResponse) ||
      error_object.is_a?(Ingenico::Direct::SDK::Domain::RefundErrorResponse) ||
      error_object.is_a?(Ingenico::Direct::SDK::Domain::ErrorResponse)
    error_id = error_object.error_id
    errors = error_object.errors
  else
    raise ArgumentError, "unsupported error object type: #{error_object.class.name}"
  end

  case status_code
    when 400
       return ValidationException.new(status_code, response_body, error_id, errors)
    when 403
      return AuthorizationException.new(status_code, response_body, error_id, errors)
    when 404, 410
      return ReferenceException.new(status_code, response_body, error_id, errors)
    when 409
      if is_idempotence_error(errors, context)
        idempotence_key = context.idempotence_key
        idempotence_request_timestamp = context.idempotence_request_timestamp
        return IdempotenceException.new(status_code, response_body, error_id,
                                        errors, idempotence_key,
                                        idempotence_request_timestamp)
      else
        return ReferenceException.new(status_code, response_body, error_id, errors)
      end
    when 500, 502, 503
      return DirectException.new(status_code, response_body, error_id, errors)
    else
      return ApiException.new(status_code, response_body, error_id, errors)
  end
end
instantiate_uri(uri, path_context = nil) click to toggle source
# File lib/ingenico/direct/sdk/api_resource.rb, line 52
def instantiate_uri(uri, path_context = nil)
  uri = replace_all(uri, path_context) if path_context
  uri = replace_all(uri, @path_context)
  @parent ? @parent.instantiate_uri(uri) : uri
end

Private Instance Methods

is_idempotence_error(errors, context) click to toggle source
# File lib/ingenico/direct/sdk/api_resource.rb, line 111
def is_idempotence_error(errors, context)
  context&.idempotence_key && errors.length == 1 && errors[0].code == '1409'
end
replace_all(uri, path_context) click to toggle source
# File lib/ingenico/direct/sdk/api_resource.rb, line 104
def replace_all(uri, path_context)
  path_context&.each do |key, value|
    uri = uri.gsub("{#{key}}", value)
  end
  uri
end