class Adyen::Client

def call_adyen_api(service, action, request_data, headers, version, _with_application_info: false)

send request to adyen API
def call_adyen_api(service, action, request_data, headers, version, _with_application_info: false)
  # get URL for requested endpoint
  url = service_url(service, action.is_a?(String) ? action : action.fetch(:url), version)
  auth_type = auth_type(service, request_data)
  # initialize Faraday connection object
  conn = Faraday.new(url, @connection_options) do |faraday|
    faraday.adapter @adapter, **@adapter_options
    faraday.headers['Content-Type'] = 'application/json'
    faraday.headers['User-Agent'] = "#{Adyen::NAME}/#{Adyen::VERSION}"
    # set header based on auth_type and service
    auth_header(auth_type, faraday)
    # add optional headers if specified in request
    # will overwrite default headers if overlapping
    headers.map do |key, value|
      faraday.headers[key] = value
    end
    # add library headers
    faraday.headers['adyen-library-name'] = Adyen::NAME
    faraday.headers['adyen-library-version'] = Adyen::VERSION
  end
  # if json string convert to hash
  # needed to add applicationInfo
  request_data = JSON.parse(request_data) if request_data.is_a?(String)
  # convert to json
  request_data = request_data.to_json
  if action.is_a?(::Hash)
    if action.fetch(:method) == 'get'
      begin
        response = conn.get
      rescue Faraday::ConnectionFailed => e
        raise e, "Connection to #{url} failed"
      end
    end
    if action.fetch(:method) == 'delete'
      begin
        response = conn.delete
      rescue Faraday::ConnectionFailed => e
        raise e, "Connection to #{url} failed"
      end
    end
    if action.fetch(:method) == 'patch'
      begin
        response = conn.patch do |req|
          req.body = request_data
        end
      rescue Faraday::ConnectionFailed => e
        raise e, "Connection to #{url} failed"
      end
    end
    if action.fetch(:method) == 'post'
      # post request to Adyen
      begin
        response = conn.post do |req|
          req.body = request_data
        end
      rescue Faraday::ConnectionFailed => e
        raise e, "Connection to #{url} failed"
      end
    end
  else
    begin
      response = conn.post do |req|
        req.body = request_data
      end
    rescue Faraday::ConnectionFailed => e
      raise e, "Connection to #{url} failed"
    end
  end
  # check for API errors
  case response.status
  when 401
    raise Adyen::AuthenticationError.new(
      'Invalid API authentication; https://docs.adyen.com/user-management/how-to-get-the-api-key', request_data
    )
  when 403
    raise Adyen::PermissionError.new('Missing user permissions; https://docs.adyen.com/user-management/user-roles',
                                     request_data, response.body)
  end
  # delete has no response.body (unless it throws an error)
  if response.body.nil? || response.body === ''
    AdyenResult.new('{}', response.headers, response.status)
  # terminal API async call returns always 'ok'
  elsif response.body === 'ok'
    AdyenResult.new('{}', response.headers, response.status)
  else
    AdyenResult.new(response.body, response.headers, response.status)
  end
end