Class: LcpSdk::Client

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

Instance Method Summary collapse

Constructor Details

#initialize(endpoint, sender_id: nil, api_key: nil, hmac_secret: nil, max_retries: 2) ⇒ Client

Returns a new instance of Client.



66
67
68
# File 'lib/lcp_sdk.rb', line 66

def initialize(endpoint, sender_id: nil, api_key: nil, hmac_secret: nil, max_retries: 2)
  @endpoint = endpoint.delete_suffix("/"); @sender_id = sender_id; @api_key = api_key; @hmac_secret = hmac_secret; @max_retries = max_retries
end

Instance Method Details

#get_capabilitiesObject



91
# File 'lib/lcp_sdk.rb', line 91

def get_capabilities; request("GET", "/v1/lcp/capabilities"); end

#list_offers(vertical = nil) ⇒ Object



92
# File 'lib/lcp_sdk.rb', line 92

def list_offers(vertical = nil); request("GET", "/v1/lcp/offers#{vertical ? "?vertical=#{URI.encode_www_form_component(vertical)}" : ""}"); end

#query_lead_status(id) ⇒ Object



90
# File 'lib/lcp_sdk.rb', line 90

def query_lead_status(id); request("GET", "/v1/lcp/leads/#{URI.encode_www_form_component(id)}"); end

#request(method, path, payload: nil, test: false) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/lcp_sdk.rb', line 70

def request(method, path, payload: nil, test: false)
  body = payload.nil? ? "" : JSON.generate(payload)
  key = payload&.dig("lcp", "message", "idempotency_key")
  (0..@max_retries).each do |attempt|
    uri = URI.join("#{@endpoint}/", path.delete_prefix("/")); request = Net::HTTP.const_get(method.capitalize).new(uri)
    request["Content-Type"] = "application/json"; request["Accept"] = "application/json"; request["X-LCP-Sender-Id"] = @sender_id if @sender_id; request["Authorization"] = "Bearer #{@api_key}" if @api_key; request["X-LCP-Idempotency-Key"] = key if key; request["X-LCP-Test"] = "true" if test
    if @hmac_secret; timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ"); request["X-LCP-Timestamp"] = timestamp; request["X-LCP-Signature"] = Signing.sign(@hmac_secret, timestamp, key, body); end
    request.body = body unless body.empty?
    response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(request) }
    data = response.body.nil? || response.body.empty? ? {} : JSON.parse(response.body)
    return data if response.is_a?(Net::HTTPSuccess)
    raise "LCP HTTP #{response.code}: #{data}" unless [429, 500, 502, 503, 504].include?(response.code.to_i) && attempt < @max_retries
    sleep(2**attempt)
  end
  raise "LCP request failed"
end

#submit_bid(envelope, test: false) ⇒ Object



89
# File 'lib/lcp_sdk.rb', line 89

def submit_bid(envelope, test: false); LcpSdk.validate_envelope(envelope); request("POST", "/v1/lcp/bids", payload: envelope, test: test); end

#submit_call(envelope, test: false) ⇒ Object



88
# File 'lib/lcp_sdk.rb', line 88

def submit_call(envelope, test: false); LcpSdk.validate_envelope(envelope); request("POST", "/v1/lcp/calls", payload: envelope, test: test); end

#submit_lead(envelope, test: false) ⇒ Object



87
# File 'lib/lcp_sdk.rb', line 87

def submit_lead(envelope, test: false); LcpSdk.validate_envelope(envelope); request("POST", "/v1/lcp/leads", payload: envelope, test: test); end