Class: Sendly::Client
- Inherits:
-
Object
- Object
- Sendly::Client
- Defined in:
- lib/sendly/client.rb
Overview
Main Sendly API client
Instance Attribute Summary collapse
-
#api_key ⇒ String
readonly
API key.
-
#base_url ⇒ String
readonly
Base URL.
-
#max_retries ⇒ Integer
readonly
Maximum retry attempts.
-
#organization_id ⇒ String?
Organization ID.
-
#timeout ⇒ Integer
readonly
Request timeout in seconds.
Instance Method Summary collapse
-
#account ⇒ Sendly::AccountResource
Access the Account resource.
-
#campaigns ⇒ Sendly::CampaignsResource
Access the Campaigns resource.
-
#contacts ⇒ Sendly::ContactsResource
Access the Contacts resource.
-
#conversations ⇒ Sendly::ConversationsResource
Access the Conversations resource.
-
#delete(path) ⇒ Hash
Make a DELETE request.
-
#drafts ⇒ Sendly::DraftsResource
Access the Drafts resource.
-
#enterprise ⇒ Sendly::EnterpriseResource
Access the Enterprise resource.
-
#get(path, params = {}) ⇒ Hash
Make a GET request.
-
#initialize(*args, api_key: nil, base_url: nil, timeout: 30, max_retries: 3, organization_id: nil) ⇒ Client
constructor
Create a new Sendly client.
-
#labels ⇒ Sendly::LabelsResource
Access the Labels resource.
-
#media ⇒ Sendly::Media
Access the Media resource.
-
#messages ⇒ Sendly::Messages
Access the Messages resource.
-
#patch(path, body = {}) ⇒ Hash
Make a PATCH request.
-
#post(path, body = {}) ⇒ Hash
Make a POST request.
-
#post_multipart(path, file, content_type: "image/jpeg", filename: "upload.jpg") ⇒ Hash
Make a multipart POST request for file uploads.
-
#put(path, body = {}) ⇒ Hash
Make a PUT request.
-
#rules ⇒ Sendly::RulesResource
Access the Rules resource.
-
#templates ⇒ Sendly::TemplatesResource
Access the Templates resource.
-
#verify ⇒ Sendly::VerifyResource
Access the Verify resource.
-
#webhooks ⇒ Sendly::WebhooksResource
Access the Webhooks resource.
Constructor Details
#initialize(*args, api_key: nil, base_url: nil, timeout: 30, max_retries: 3, organization_id: nil) ⇒ Client
Create a new Sendly client.
Two calling conventions are supported (both produce the same client):
# Positional (matches Sendly's published code samples and the
# idiom of most other Ruby HTTP SDKs):
client = Sendly::Client.new("sk_live_v1_xxx")
client = Sendly::Client.new("sk_live_v1_xxx", timeout: 60)
# Keyword (existing v3.30.0 signature):
client = Sendly::Client.new(api_key: "sk_live_v1_xxx")
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/sendly/client.rb', line 43 def initialize(*args, api_key: nil, base_url: nil, timeout: 30, max_retries: 3, organization_id: nil) # Backward-compatible positional API key. Previously this constructor # only accepted `api_key:` as a keyword; every code sample in our # docs used positional, breaking copy-paste for new users. if !args.empty? raise ArgumentError, "Sendly::Client.new accepts at most one positional argument (api_key)" if args.length > 1 raise ArgumentError, "Cannot pass api_key both positionally and as keyword" unless api_key.nil? api_key = args.first end @api_key = api_key @base_url = (base_url || Sendly.base_url).chomp("/") @timeout = timeout @max_retries = max_retries @organization_id = organization_id || ENV["SENDLY_ORG_ID"] validate_api_key! end |
Instance Attribute Details
#api_key ⇒ String (readonly)
Returns API key.
12 13 14 |
# File 'lib/sendly/client.rb', line 12 def api_key @api_key end |
#base_url ⇒ String (readonly)
Returns Base URL.
15 16 17 |
# File 'lib/sendly/client.rb', line 15 def base_url @base_url end |
#max_retries ⇒ Integer (readonly)
Returns Maximum retry attempts.
21 22 23 |
# File 'lib/sendly/client.rb', line 21 def max_retries @max_retries end |
#organization_id ⇒ String?
Returns Organization ID.
24 25 26 |
# File 'lib/sendly/client.rb', line 24 def organization_id @organization_id end |
#timeout ⇒ Integer (readonly)
Returns Request timeout in seconds.
18 19 20 |
# File 'lib/sendly/client.rb', line 18 def timeout @timeout end |
Instance Method Details
#account ⇒ Sendly::AccountResource
Access the Account resource
79 80 81 |
# File 'lib/sendly/client.rb', line 79 def account @account ||= AccountResource.new(self) end |
#campaigns ⇒ Sendly::CampaignsResource
Access the Campaigns resource
107 108 109 |
# File 'lib/sendly/client.rb', line 107 def campaigns @campaigns ||= CampaignsResource.new(self) end |
#contacts ⇒ Sendly::ContactsResource
Access the Contacts resource
114 115 116 |
# File 'lib/sendly/client.rb', line 114 def contacts @contacts ||= ContactsResource.new(self) end |
#conversations ⇒ Sendly::ConversationsResource
Access the Conversations resource
121 122 123 |
# File 'lib/sendly/client.rb', line 121 def conversations @conversations ||= ConversationsResource.new(self) end |
#delete(path) ⇒ Hash
Make a DELETE request
193 194 195 |
# File 'lib/sendly/client.rb', line 193 def delete(path) request(:delete, path) end |
#drafts ⇒ Sendly::DraftsResource
Access the Drafts resource
135 136 137 |
# File 'lib/sendly/client.rb', line 135 def drafts @drafts ||= DraftsResource.new(self) end |
#enterprise ⇒ Sendly::EnterpriseResource
Access the Enterprise resource
149 150 151 |
# File 'lib/sendly/client.rb', line 149 def enterprise @enterprise ||= EnterpriseResource.new(self) end |
#get(path, params = {}) ⇒ Hash
Make a GET request
158 159 160 |
# File 'lib/sendly/client.rb', line 158 def get(path, params = {}) request(:get, path, params: params) end |
#labels ⇒ Sendly::LabelsResource
Access the Labels resource
128 129 130 |
# File 'lib/sendly/client.rb', line 128 def labels @labels ||= LabelsResource.new(self) end |
#media ⇒ Sendly::Media
Access the Media resource
100 101 102 |
# File 'lib/sendly/client.rb', line 100 def media @media ||= Media.new(self) end |
#messages ⇒ Sendly::Messages
Access the Messages resource
65 66 67 |
# File 'lib/sendly/client.rb', line 65 def @messages ||= Messages.new(self) end |
#patch(path, body = {}) ⇒ Hash
Make a PATCH request
176 177 178 |
# File 'lib/sendly/client.rb', line 176 def patch(path, body = {}) request(:patch, path, body: body) end |
#post(path, body = {}) ⇒ Hash
Make a POST request
167 168 169 |
# File 'lib/sendly/client.rb', line 167 def post(path, body = {}) request(:post, path, body: body) end |
#post_multipart(path, file, content_type: "image/jpeg", filename: "upload.jpg") ⇒ Hash
Make a multipart POST request for file uploads
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/sendly/client.rb', line 204 def post_multipart(path, file, content_type: "image/jpeg", filename: "upload.jpg") uri = build_uri(path, {}) http = build_http(uri) boundary = "SendlyRuby#{SecureRandom.hex(16)}" file_data = file.is_a?(String) ? File.binread(file) : file.read body = [] body << "--#{boundary}\r\n" body << "Content-Disposition: form-data; name=\"file\"; filename=\"#{filename}\"\r\n" body << "Content-Type: #{content_type}\r\n\r\n" body << file_data body << "\r\n--#{boundary}--\r\n" req = Net::HTTP::Post.new(uri) req["Authorization"] = "Bearer #{api_key}" req["Accept"] = "application/json" req["User-Agent"] = "sendly-ruby/#{VERSION}" req["Content-Type"] = "multipart/form-data; boundary=#{boundary}" req["X-Organization-Id"] = @organization_id if @organization_id req.body = body.join attempt = 0 begin response = http.request(req) handle_response(response) rescue Net::OpenTimeout, Net::ReadTimeout raise TimeoutError, "Request timed out after #{timeout} seconds" rescue Errno::ECONNREFUSED, Errno::ECONNRESET, SocketError => e raise NetworkError, "Connection failed: #{e.}" rescue RateLimitError => e attempt += 1 if attempt <= max_retries && e.retry_after sleep(e.retry_after) retry end raise rescue ServerError => e attempt += 1 if attempt <= max_retries sleep(2 ** attempt) retry end raise end end |
#put(path, body = {}) ⇒ Hash
Make a PUT request
185 186 187 |
# File 'lib/sendly/client.rb', line 185 def put(path, body = {}) request(:put, path, body: body) end |
#rules ⇒ Sendly::RulesResource
Access the Rules resource
142 143 144 |
# File 'lib/sendly/client.rb', line 142 def rules @rules ||= RulesResource.new(self) end |
#templates ⇒ Sendly::TemplatesResource
Access the Templates resource
93 94 95 |
# File 'lib/sendly/client.rb', line 93 def templates @templates ||= TemplatesResource.new(self) end |
#verify ⇒ Sendly::VerifyResource
Access the Verify resource
86 87 88 |
# File 'lib/sendly/client.rb', line 86 def verify @verify ||= VerifyResource.new(self) end |
#webhooks ⇒ Sendly::WebhooksResource
Access the Webhooks resource
72 73 74 |
# File 'lib/sendly/client.rb', line 72 def webhooks @webhooks ||= WebhooksResource.new(self) end |