class Adyen::Client
def call_adyen_api(service, action, request_data, headers, version, _with_application_info: false)
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