class Zendesk2::Real

Attributes

jwt_token[RW]
last_request[RW]
logger[RW]
token[RW]
url[RW]
username[RW]

Public Class Methods

new(options = {}) click to toggle source

rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

# File lib/zendesk2/real.rb, line 6
def initialize(options = {})
  url = options[:url] || Zendesk2.defaults[:url]

  @url = (URI.parse(url).to_s if url)

  @logger   = options[:logger]   || Logger.new(nil)
  @adapter  = options[:adapter]  || Faraday.default_adapter
  @username = options[:username] || Zendesk2.defaults[:username]
  @token    = options.fetch(:token, Zendesk2.defaults[:token])
  password  = options[:password] || Zendesk2.defaults[:password]

  @auth_token  = password || @token
  @auth_id     = "#{@username}/token" if @auth_token == @token
  @jwt_token   = options[:jwt_token]

  raise 'Missing required options: :url' unless @url
  raise 'Missing required options: :username' unless @auth_id
  raise 'Missing required options: :password or :token' unless password || @token

  connection
end

Public Instance Methods

connection() click to toggle source
# File lib/zendesk2/real.rb, line 28
def connection
  @connection ||= Faraday.new(url: @url) do |connection|
    # response
    connection.use Faraday::Request::BasicAuthentication, @auth_id, @auth_token
    connection.use Faraday::Response::RaiseError
    connection.response :json, content_type: /\bjson/

    # request
    connection.request :multipart
    connection.request :json

    # idempotency
    connection.request :retry,
                       max: 30,
                       interval: 1,
                       interval_randomness: 0.2,
                       backoff_factor: 2

    # rate limit
    connection.use Zendesk2::RateLimit, logger: @logger

    connection.use Zendesk2::Logger, @logger
    connection.adapter(*@adapter)
  end
end
request(options = {}) click to toggle source
# File lib/zendesk2/real.rb, line 54
def request(options = {})
  method  = options[:method] || :get
  url     = options[:url] || File.join(@url, '/api/v2', options[:path])
  params  = options[:params] || {}
  body    = options[:body]
  headers = { 'User-Agent' => Zendesk2::USER_AGENT }.merge(options[:headers] || {})

  connection.send(method) do |req|
    req.url(url)
    req.headers.merge!(headers)
    req.params.merge!(params)
    req.body = @last_request = body
  end
rescue Faraday::ConnectionFailed
  raise
rescue Faraday::Error::ClientError => e
  raise Zendesk2::Error, e
end