Class: Billingrails::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/billingrails/client.rb

Overview

Main client for interacting with the Billingrails API

Constant Summary collapse

DEFAULT_BASE_URL =
'https://api.billingrails.com/v1'
DEFAULT_TIMEOUT =
30
DEFAULT_MAX_RETRIES =
3
RETRYABLE_HTTP_STATUSES =
[429, 500, 502, 503, 504].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, base_url: DEFAULT_BASE_URL, timeout: DEFAULT_TIMEOUT, max_retries: DEFAULT_MAX_RETRIES) ⇒ Client

Initialize a new client

Parameters:

  • api_key (String)

    Your API key

  • base_url (String) (defaults to: DEFAULT_BASE_URL)

    Base URL for API requests

  • timeout (Integer) (defaults to: DEFAULT_TIMEOUT)

    Request timeout in seconds

  • max_retries (Integer) (defaults to: DEFAULT_MAX_RETRIES)

    Max attempts per call for retryable HTTP statuses (see RETRYABLE_HTTP_STATUSES); connection errors are not retried. Default 3.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/billingrails/client.rb', line 27

def initialize(api_key:, base_url: DEFAULT_BASE_URL, timeout: DEFAULT_TIMEOUT, max_retries: DEFAULT_MAX_RETRIES)
  @api_key = api_key
  @base_url = base_url.chomp('/')
  @timeout = timeout
  @max_retries = max_retries
  validate_config!

  # Initialize top-level resources
  @accounts = Resources::Accounts.new(self)
  @invoices = Resources::Invoices.new(self)
  @payments = Resources::Payments.new(self)
  @payment_pages = Resources::PaymentLinks.new(self)
  @checkout_sessions = Resources::CheckoutSessions.new(self)

  @subscriptions = Resources::Subscriptions.new(self)
  @products = Resources::Products.new(self)
  @prices = Resources::Prices.new(self)
  @plans = Resources::Plans.new(self)
  @events = Resources::Events.new(self)
  @meters = Resources::Meters.new(self)

  @credit_grants = Resources::CreditGrants.new(self)
  @discounts = Resources::Discounts.new(self)
  @tax_rates = Resources::TaxRates.new(self)
end

Instance Attribute Details

#accountsObject (readonly)

Returns the value of attribute accounts.



17
18
19
# File 'lib/billingrails/client.rb', line 17

def accounts
  @accounts
end

#api_keyObject (readonly)

Returns the value of attribute api_key.



16
17
18
# File 'lib/billingrails/client.rb', line 16

def api_key
  @api_key
end

#base_urlObject (readonly)

Returns the value of attribute base_url.



16
17
18
# File 'lib/billingrails/client.rb', line 16

def base_url
  @base_url
end

#credit_grantsObject (readonly)

Returns the value of attribute credit_grants.



19
20
21
# File 'lib/billingrails/client.rb', line 19

def credit_grants
  @credit_grants
end

#discountsObject (readonly)

Returns the value of attribute discounts.



19
20
21
# File 'lib/billingrails/client.rb', line 19

def discounts
  @discounts
end

#eventsObject (readonly)

Returns the value of attribute events.



18
19
20
# File 'lib/billingrails/client.rb', line 18

def events
  @events
end

#feesObject (readonly)

Returns the value of attribute fees.



18
19
20
# File 'lib/billingrails/client.rb', line 18

def fees
  @fees
end

#invoicesObject (readonly)

Returns the value of attribute invoices.



17
18
19
# File 'lib/billingrails/client.rb', line 17

def invoices
  @invoices
end

#max_retriesObject (readonly)

Returns the value of attribute max_retries.



16
17
18
# File 'lib/billingrails/client.rb', line 16

def max_retries
  @max_retries
end

#metersObject (readonly)

Returns the value of attribute meters.



18
19
20
# File 'lib/billingrails/client.rb', line 18

def meters
  @meters
end

Returns the value of attribute payment_links.



17
18
19
# File 'lib/billingrails/client.rb', line 17

def payment_links
  @payment_links
end

#paymentsObject (readonly)

Returns the value of attribute payments.



17
18
19
# File 'lib/billingrails/client.rb', line 17

def payments
  @payments
end

#plansObject (readonly)

Returns the value of attribute plans.



18
19
20
# File 'lib/billingrails/client.rb', line 18

def plans
  @plans
end

#pricesObject (readonly)

Returns the value of attribute prices.



18
19
20
# File 'lib/billingrails/client.rb', line 18

def prices
  @prices
end

#subscriptionsObject (readonly)

Returns the value of attribute subscriptions.



18
19
20
# File 'lib/billingrails/client.rb', line 18

def subscriptions
  @subscriptions
end

#timeoutObject (readonly)

Returns the value of attribute timeout.



16
17
18
# File 'lib/billingrails/client.rb', line 16

def timeout
  @timeout
end

Instance Method Details

#request(method, path, body: nil, params: nil) ⇒ Hash

Make an HTTP request

Parameters:

  • method (Symbol)

    HTTP method (:get, :post, :put, :patch, :delete)

  • path (String)

    API endpoint path

  • body (Hash, nil) (defaults to: nil)

    Request body

  • params (Hash, nil) (defaults to: nil)

    Query parameters

Returns:

  • (Hash)

    Parsed response body



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/billingrails/client.rb', line 60

def request(method, path, body: nil, params: nil)
  uri = build_uri(path, params)
  http_request = build_request(method, uri, body)

  last_exception = nil
  last_error_response = nil

  @max_retries.times do |attempt|
    begin
      response = execute_request(uri, http_request)
    rescue StandardError => e
      last_exception = e
      break
    end

    last_exception = nil
    code = response.code.to_i

    if (200..299).cover?(code)
      return {} if response.body.nil? || response.body.empty?
      return JSON.parse(response.body)
    end

    if attempt < @max_retries - 1 && retryable_status?(code)
      sleep(2**attempt)
      next
    end

    last_error_response = response
    break
  end

  if last_error_response
    handle_response(last_error_response)
  elsif last_exception
    raise ConnectionError, "Failed to connect to API: #{last_exception.message}"
  else
    raise ConnectionError, 'Failed to connect to API'
  end
end