Class: Sendly::Messages
- Inherits:
-
Object
- Object
- Sendly::Messages
- Defined in:
- lib/sendly/messages.rb
Overview
Messages resource for sending and managing SMS
Instance Attribute Summary collapse
-
#client ⇒ Sendly::Client
readonly
The API client.
Instance Method Summary collapse
-
#cancel_scheduled(id) ⇒ Hash
Cancel a scheduled message.
-
#each(status: nil, to: nil, batch_size: 100) {|Message| ... } ⇒ Enumerator
Iterate over all messages with automatic pagination.
-
#get(id) ⇒ Sendly::Message
Get a message by ID.
-
#get_batch(batch_id) ⇒ Hash
Get batch status by ID.
-
#get_scheduled(id) ⇒ Hash
Get a scheduled message by ID.
-
#initialize(client) ⇒ Messages
constructor
A new instance of Messages.
-
#list(limit: 20, offset: 0, status: nil, to: nil) ⇒ Sendly::MessageList
List messages.
-
#list_batches(limit: 20, offset: 0, status: nil) ⇒ Hash
List batches.
-
#list_scheduled(limit: 20, offset: 0, status: nil) ⇒ Hash
List scheduled messages.
-
#preview_batch(messages:, from: nil, message_type: nil) ⇒ Hash
Preview a batch without sending (dry run).
-
#schedule(to:, text:, scheduled_at:, from: nil, message_type: nil, metadata: nil) ⇒ Hash
Schedule an SMS message for future delivery.
-
#send(to:, text:, message_type: nil, metadata: nil, media_urls: nil) ⇒ Sendly::Message
Send an SMS message.
-
#send_batch(messages:, from: nil, message_type: nil, metadata: nil) ⇒ Hash
Send multiple SMS messages in a batch.
Constructor Details
#initialize(client) ⇒ Messages
Returns a new instance of Messages.
9 10 11 |
# File 'lib/sendly/messages.rb', line 9 def initialize(client) @client = client end |
Instance Attribute Details
#client ⇒ Sendly::Client (readonly)
Returns The API client.
7 8 9 |
# File 'lib/sendly/messages.rb', line 7 def client @client end |
Instance Method Details
#cancel_scheduled(id) ⇒ Hash
Cancel a scheduled message
208 209 210 211 212 213 |
# File 'lib/sendly/messages.rb', line 208 def cancel_scheduled(id) raise ValidationError, "Scheduled message ID is required" if id.nil? || id.empty? encoded_id = URI.encode_www_form_component(id) client.delete("/messages/scheduled/#{encoded_id}") end |
#each(status: nil, to: nil, batch_size: 100) {|Message| ... } ⇒ Enumerator
Iterate over all messages with automatic pagination
114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/sendly/messages.rb', line 114 def each(status: nil, to: nil, batch_size: 100, &block) return enum_for(:each, status: status, to: to, batch_size: batch_size) unless block_given? offset = 0 loop do page = list(limit: batch_size, offset: offset, status: status, to: to) page.each(&block) break unless page.has_more offset += batch_size end end |
#get(id) ⇒ Sendly::Message
Get a message by ID
92 93 94 95 96 97 98 99 100 |
# File 'lib/sendly/messages.rb', line 92 def get(id) raise ValidationError, "Message ID is required" if id.nil? || id.empty? # URL encode the ID to prevent path injection encoded_id = URI.encode_www_form_component(id) response = client.get("/messages/#{encoded_id}") # API returns message directly at top level Message.new(response) end |
#get_batch(batch_id) ⇒ Hash
Get batch status by ID
265 266 267 268 269 270 |
# File 'lib/sendly/messages.rb', line 265 def get_batch(batch_id) raise ValidationError, "Batch ID is required" if batch_id.nil? || batch_id.empty? encoded_id = URI.encode_www_form_component(batch_id) client.get("/messages/batch/#{encoded_id}") end |
#get_scheduled(id) ⇒ Hash
Get a scheduled message by ID
190 191 192 193 194 195 |
# File 'lib/sendly/messages.rb', line 190 def get_scheduled(id) raise ValidationError, "Scheduled message ID is required" if id.nil? || id.empty? encoded_id = URI.encode_www_form_component(id) client.get("/messages/scheduled/#{encoded_id}") end |
#list(limit: 20, offset: 0, status: nil, to: nil) ⇒ Sendly::MessageList
List messages
70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/sendly/messages.rb', line 70 def list(limit: 20, offset: 0, status: nil, to: nil) params = { limit: [limit, 100].min, offset: offset } params[:status] = status if status params[:to] = to if to response = client.get("/messages", params.compact) MessageList.new(response) end |
#list_batches(limit: 20, offset: 0, status: nil) ⇒ Hash
List batches
282 283 284 285 286 287 288 289 290 |
# File 'lib/sendly/messages.rb', line 282 def list_batches(limit: 20, offset: 0, status: nil) params = { limit: [limit, 100].min, offset: offset } params[:status] = status if status client.get("/messages/batches", params.compact) end |
#list_scheduled(limit: 20, offset: 0, status: nil) ⇒ Hash
List scheduled messages
170 171 172 173 174 175 176 177 178 |
# File 'lib/sendly/messages.rb', line 170 def list_scheduled(limit: 20, offset: 0, status: nil) params = { limit: [limit, 100].min, offset: offset } params[:status] = status if status client.get("/messages/scheduled", params.compact) end |
#preview_batch(messages:, from: nil, message_type: nil) ⇒ Hash
Preview a batch without sending (dry run)
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
# File 'lib/sendly/messages.rb', line 310 def preview_batch(messages:, from: nil, message_type: nil) raise ValidationError, "Messages array is required" if .nil? || .empty? .each_with_index do |msg, i| raise ValidationError, "Message at index #{i} missing 'to'" unless msg[:to] || msg["to"] raise ValidationError, "Message at index #{i} missing 'text'" unless msg[:text] || msg["text"] to = msg[:to] || msg["to"] text = msg[:text] || msg["text"] validate_phone!(to) validate_text!(text) end body = { messages: } body[:from] = from if from body[:messageType] = if client.post("/messages/batch/preview", body) end |
#schedule(to:, text:, scheduled_at:, from: nil, message_type: nil, metadata: nil) ⇒ Hash
Schedule an SMS message for future delivery
147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/sendly/messages.rb', line 147 def schedule(to:, text:, scheduled_at:, from: nil, message_type: nil, metadata: nil) validate_phone!(to) validate_text!(text) raise ValidationError, "scheduled_at is required" if scheduled_at.nil? || scheduled_at.empty? body = { to: to, text: text, scheduledAt: scheduled_at } body[:from] = from if from body[:messageType] = if body[:metadata] = if client.post("/messages/schedule", body) end |
#send(to:, text:, message_type: nil, metadata: nil, media_urls: nil) ⇒ Sendly::Message
Send an SMS message
39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/sendly/messages.rb', line 39 def send(to:, text:, message_type: nil, metadata: nil, media_urls: nil) validate_phone!(to) validate_text!(text) body = { to: to, text: text } body[:messageType] = if body[:metadata] = if body[:mediaUrls] = media_urls if media_urls response = client.post("/messages", body) # API returns message directly at top level Message.new(response) end |
#send_batch(messages:, from: nil, message_type: nil, metadata: nil) ⇒ Hash
Send multiple SMS messages in a batch
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
# File 'lib/sendly/messages.rb', line 234 def send_batch(messages:, from: nil, message_type: nil, metadata: nil) raise ValidationError, "Messages array is required" if .nil? || .empty? .each_with_index do |msg, i| raise ValidationError, "Message at index #{i} missing 'to'" unless msg[:to] || msg["to"] raise ValidationError, "Message at index #{i} missing 'text'" unless msg[:text] || msg["text"] to = msg[:to] || msg["to"] text = msg[:text] || msg["text"] validate_phone!(to) validate_text!(text) end body = { messages: } body[:from] = from if from body[:messageType] = if body[:metadata] = if client.post("/messages/batch", body) end |