Class: WhatsAppCloudApi::Client

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

Constant Summary collapse

DEFAULT_BASE_URL =
'https://graph.facebook.com'
DEFAULT_GRAPH_VERSION =
'v24.0'
KAPSO_PROXY_PATTERN =
/kapso\.ai/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(access_token: nil, kapso_api_key: nil, base_url: nil, graph_version: nil, logger: nil, debug: nil, timeout: nil, open_timeout: nil, max_retries: nil, retry_delay: nil) ⇒ Client

Returns a new instance of Client.



17
18
19
20
21
22
23
24
25
26
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
52
# File 'lib/whatsapp_cloud_api/client.rb', line 17

def initialize(access_token: nil, kapso_api_key: nil, base_url: nil, 
               graph_version: nil, logger: nil, debug: nil, timeout: nil, 
               open_timeout: nil, max_retries: nil, retry_delay: nil)
  
  # Validation
  unless access_token || kapso_api_key
    raise Errors::ConfigurationError, 'Must provide either access_token or kapso_api_key'
  end

  @access_token = access_token
  @kapso_api_key = kapso_api_key
  @base_url = normalize_base_url(base_url || DEFAULT_BASE_URL)
  @graph_version = graph_version || DEFAULT_GRAPH_VERSION
  @kapso_proxy = detect_kapso_proxy(@base_url)
  
  # Configuration with defaults
  config = WhatsAppCloudApi.configuration
  @logger = logger || WhatsAppCloudApi.logger
  @debug = debug.nil? ? config.debug : debug
  @timeout = timeout || config.timeout
  @open_timeout = open_timeout || config.open_timeout
  @max_retries = max_retries || config.max_retries
  @retry_delay = retry_delay || config.retry_delay

  # Initialize HTTP client
  @http_client = build_http_client

  # Initialize resource endpoints
  @messages = nil
  @media = nil
  @templates = nil
  @phone_numbers = nil
  @calls = nil
  @conversations = nil
  @contacts = nil
end

Instance Attribute Details

#access_tokenObject (readonly)

Returns the value of attribute access_token.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def access_token
  @access_token
end

#base_urlObject (readonly)

Returns the value of attribute base_url.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def base_url
  @base_url
end

#debugObject (readonly)

Returns the value of attribute debug.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def debug
  @debug
end

#graph_versionObject (readonly)

Returns the value of attribute graph_version.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def graph_version
  @graph_version
end

#kapso_api_keyObject (readonly)

Returns the value of attribute kapso_api_key.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def kapso_api_key
  @kapso_api_key
end

#loggerObject (readonly)

Returns the value of attribute logger.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def logger
  @logger
end

#max_retriesObject (readonly)

Returns the value of attribute max_retries.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def max_retries
  @max_retries
end

#open_timeoutObject (readonly)

Returns the value of attribute open_timeout.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def open_timeout
  @open_timeout
end

#retry_delayObject (readonly)

Returns the value of attribute retry_delay.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def retry_delay
  @retry_delay
end

#timeoutObject (readonly)

Returns the value of attribute timeout.



14
15
16
# File 'lib/whatsapp_cloud_api/client.rb', line 14

def timeout
  @timeout
end

Instance Method Details

#callsObject



71
72
73
# File 'lib/whatsapp_cloud_api/client.rb', line 71

def calls
  @calls ||= Resources::Calls.new(self)
end

#contactsObject



79
80
81
# File 'lib/whatsapp_cloud_api/client.rb', line 79

def contacts
  @contacts ||= Resources::Contacts.new(self)
end

#conversationsObject



75
76
77
# File 'lib/whatsapp_cloud_api/client.rb', line 75

def conversations
  @conversations ||= Resources::Conversations.new(self)
end

#fetch(url, options = {}) ⇒ Object

Fetch with automatic auth headers (for absolute URLs)



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/whatsapp_cloud_api/client.rb', line 139

def fetch(url, options = {})
  headers = build_headers(options[:headers] || {})
  method = options[:method] || 'GET'
  
  log_request(method, url, headers, options[:body]) if debug
  
  response = @http_client.run_request(method.downcase.to_sym, url, options[:body], headers)
  
  log_response(response) if debug
  
  if response.success?
    response
  else
    handle_error_response(response)
  end
end

#kapso_proxy?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/whatsapp_cloud_api/client.rb', line 83

def kapso_proxy?
  @kapso_proxy
end

#mediaObject



59
60
61
# File 'lib/whatsapp_cloud_api/client.rb', line 59

def media
  @media ||= Resources::Media.new(self)
end

#messagesObject

Resource accessors with lazy initialization



55
56
57
# File 'lib/whatsapp_cloud_api/client.rb', line 55

def messages
  @messages ||= Resources::Messages.new(self)
end

#phone_numbersObject



67
68
69
# File 'lib/whatsapp_cloud_api/client.rb', line 67

def phone_numbers
  @phone_numbers ||= Resources::PhoneNumbers.new(self)
end

#raw_request(method, url, options = {}) ⇒ Object

Raw HTTP method without automatic error handling (for media downloads, etc.)



126
127
128
129
130
131
132
133
134
135
136
# File 'lib/whatsapp_cloud_api/client.rb', line 126

def raw_request(method, url, options = {})
  headers = build_headers(options[:headers] || {})
  
  log_request(method, url, headers, options[:body]) if debug
  
  response = @http_client.run_request(method.to_sym, url, options[:body], headers)
  
  log_response(response) if debug
  
  response
end

#request(method, path, options = {}) ⇒ Object

Main request method with retry logic and error handling



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/whatsapp_cloud_api/client.rb', line 88

def request(method, path, options = {})
  method = method.to_s.upcase
  body = options[:body]
  query = options[:query]
  custom_headers = options[:headers] || {}
  response_type = options[:response_type] || :auto

  url = build_url(path, query)
  headers = build_headers(custom_headers)
  
  # Log request if debugging
  log_request(method, url, headers, body) if debug

  retries = 0
  begin
    response = @http_client.run_request(method.downcase.to_sym, url, body, headers)
    
    # Log response if debugging
    log_response(response) if debug

    # Handle response based on type requested
    handle_response(response, response_type)
  rescue Faraday::Error => e
    retries += 1
    if retries <= max_retries && retryable_error?(e)
      sleep(retry_delay * retries)
      retry
    else
      raise Errors::GraphApiError.new(
        message: "Network error: #{e.message}",
        http_status: 0,
        category: :server
      )
    end
  end
end

#templatesObject



63
64
65
# File 'lib/whatsapp_cloud_api/client.rb', line 63

def templates
  @templates ||= Resources::Templates.new(self)
end