vonage 7.5.1 → 7.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -2
- data/lib/vonage/client.rb +7 -0
- data/lib/vonage/messaging/channels/messenger.rb +39 -0
- data/lib/vonage/messaging/channels/mms.rb +34 -0
- data/lib/vonage/messaging/channels/sms.rb +31 -0
- data/lib/vonage/messaging/channels/viber.rb +39 -0
- data/lib/vonage/messaging/channels/whats_app.rb +47 -0
- data/lib/vonage/messaging/message.rb +42 -0
- data/lib/vonage/messaging.rb +29 -0
- data/lib/vonage/version.rb +1 -1
- data/lib/vonage.rb +1 -0
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c49e3250bfdfaea4ece849f64f65e3e7820dafb185fc9816ccb5ae7c2a37a7c
|
4
|
+
data.tar.gz: 402ae1133d19b7a6871642c480b2b2db162e0f560a1179513c088c5209f7e6f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fdb9e9324d0a7c3d41b7670d20bfe16922a41ac97eb15a404a2a69394ee3d6b06fb7d37fbb90cf21dda1b15a35cbe64cfefc2236c2b3e1f0a36438b74e67b75
|
7
|
+
data.tar.gz: 8d80c1b1aef68c354170a5e906427883ae8c48b931cf845f101a72addee80e397517a5c64046a333585963e4a0fde20e2cc48353f7a64908744bd1b72e887195
|
data/README.md
CHANGED
@@ -98,7 +98,7 @@ By default the hosts are set to `api.nexmo.com` and `rest.nexmo.com`, respective
|
|
98
98
|
|
99
99
|
## JWT authentication
|
100
100
|
|
101
|
-
To call newer endpoints that support JWT authentication such as the Voice API you'll
|
101
|
+
To call newer endpoints that support JWT authentication such as the Voice API and Messages API you'll
|
102
102
|
also need to specify the `application_id` and `private_key` options. For example:
|
103
103
|
|
104
104
|
```ruby
|
@@ -194,6 +194,32 @@ response = client.voice.create({
|
|
194
194
|
})
|
195
195
|
```
|
196
196
|
|
197
|
+
## Messages API
|
198
|
+
|
199
|
+
The [Vonage Messages API](https://developer.vonage.com/messages/overview) allows you to send messages over a number of different channels, and various message types within each channel. See the Vonage Developer Documentation for a [complete API reference](https://developer.vonage.com/api/messages-olympus) listing all the channel and message type combinations.
|
200
|
+
|
201
|
+
The Ruby SDK allows you to construct message data for specific messaging channels. Other than SMS (which has only one type -- text), you need to pass the message `:type` as well as the `:message` itself as arguments to the appropriate messages method, along with any optional properties if needed.
|
202
|
+
|
203
|
+
```ruby
|
204
|
+
# creating an SMS message
|
205
|
+
message = Vonage::Messaging::Message.sms(message: 'Hello world!')
|
206
|
+
|
207
|
+
# creating a WhatsApp Text message
|
208
|
+
message = Vonage::Messaging::Message.whatsapp(type: 'text', message: 'Hello world!')
|
209
|
+
|
210
|
+
# creating a WhatsApp Image message
|
211
|
+
message = Vonage::Messaging::Message.whatsapp(type: 'image', message: { url: 'https://example.com/image.jpg' })
|
212
|
+
|
213
|
+
# creating an MMS audio message with optional properties
|
214
|
+
message = Vonage::Messaging::Message.mms(type: 'audio', message: { url: 'https://example.com/audio.mp3' }, opts: {client_ref: "abc123"})
|
215
|
+
```
|
216
|
+
|
217
|
+
Once the message data is created, you can then send the message.
|
218
|
+
|
219
|
+
```ruby
|
220
|
+
response = client.messaging.send(to: "447700900000", from: "447700900001", **message)
|
221
|
+
```
|
222
|
+
|
197
223
|
## Documentation
|
198
224
|
|
199
225
|
Vonage Ruby documentation: https://www.rubydoc.info/github/Vonage/vonage-ruby-sdk
|
@@ -218,7 +244,7 @@ The following is a list of Vonage APIs and whether the Ruby SDK provides support
|
|
218
244
|
| Dispatch API | Beta |❌|
|
219
245
|
| External Accounts API | Beta |❌|
|
220
246
|
| Media API | Beta | ❌|
|
221
|
-
| Messages API |
|
247
|
+
| Messages API | General Availability |✅|
|
222
248
|
| Number Insight API | General Availability |✅|
|
223
249
|
| Number Management API | General Availability |✅|
|
224
250
|
| Pricing API | General Availability |✅|
|
data/lib/vonage/client.rb
CHANGED
@@ -68,6 +68,13 @@ module Vonage
|
|
68
68
|
@messages ||= T.let(Messages.new(config), T.nilable(Vonage::Messages))
|
69
69
|
end
|
70
70
|
|
71
|
+
# @return [Messaging]
|
72
|
+
#
|
73
|
+
sig { returns(T.nilable(Vonage::Messaging)) }
|
74
|
+
def messaging
|
75
|
+
@messaging ||= T.let(Messaging.new(config), T.nilable(Vonage::Messaging))
|
76
|
+
end
|
77
|
+
|
71
78
|
# @return [NumberInsight]
|
72
79
|
#
|
73
80
|
sig { returns(T.nilable(Vonage::NumberInsight)) }
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Vonage
|
4
|
+
class Messaging::Channels::Messenger < Messaging::Message
|
5
|
+
MESSAGE_TYPES = ['text', 'image', 'audio', 'video', 'file']
|
6
|
+
|
7
|
+
attr_reader :data
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@type = attributes.fetch(:type, nil)
|
11
|
+
@message = attributes.fetch(:message, nil)
|
12
|
+
@opts = attributes.fetch(:opts, {})
|
13
|
+
@data = {}
|
14
|
+
|
15
|
+
after_initialize!
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def build
|
21
|
+
data[:channel] = 'messenger'
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def verify_type
|
26
|
+
raise Vonage::ClientError.new("Invalid message type") unless MESSAGE_TYPES.include?(type)
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_message
|
30
|
+
case type
|
31
|
+
when 'text'
|
32
|
+
raise Vonage::ClientError.new(":message must be a String") unless message.is_a? String
|
33
|
+
else
|
34
|
+
raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
|
35
|
+
raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Vonage
|
4
|
+
class Messaging::Channels::MMS < Messaging::Message
|
5
|
+
MESSAGE_TYPES = ['image', 'vcard', 'audio', 'video']
|
6
|
+
|
7
|
+
attr_reader :data
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@type = attributes.fetch(:type, nil)
|
11
|
+
@message = attributes.fetch(:message, nil)
|
12
|
+
@opts = attributes.fetch(:opts, {})
|
13
|
+
@data = {}
|
14
|
+
|
15
|
+
after_initialize!
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def build
|
21
|
+
data[:channel] = 'mms'
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def verify_type
|
26
|
+
raise Vonage::ClientError.new("Invalid message type") unless MESSAGE_TYPES.include?(type)
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_message
|
30
|
+
raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
|
31
|
+
raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Vonage
|
4
|
+
class Messaging::Channels::SMS < Messaging::Message
|
5
|
+
attr_reader :data
|
6
|
+
|
7
|
+
def initialize(attributes = {})
|
8
|
+
@type = attributes.fetch(:type, 'text')
|
9
|
+
@message = attributes.fetch(:message, nil)
|
10
|
+
@opts = attributes.fetch(:opts, {})
|
11
|
+
@data = {}
|
12
|
+
|
13
|
+
after_initialize!
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def build
|
19
|
+
data[:channel] = 'sms'
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def verify_type
|
24
|
+
raise Vonage::ClientError.new("Invalid message type") unless type == 'text'
|
25
|
+
end
|
26
|
+
|
27
|
+
def verify_message
|
28
|
+
raise Vonage::ClientError.new(":message must be a String") unless message.is_a? String
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Vonage
|
4
|
+
class Messaging::Channels::Viber < Messaging::Message
|
5
|
+
MESSAGE_TYPES = ['text', 'image']
|
6
|
+
|
7
|
+
attr_reader :data
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@type = attributes.fetch(:type, nil)
|
11
|
+
@message = attributes.fetch(:message, nil)
|
12
|
+
@opts = attributes.fetch(:opts, {})
|
13
|
+
@data = {}
|
14
|
+
|
15
|
+
after_initialize!
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def build
|
21
|
+
data[:channel] = ' viber_service'
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def verify_type
|
26
|
+
raise Vonage::ClientError.new("Invalid message type") unless MESSAGE_TYPES.include?(type)
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_message
|
30
|
+
case type
|
31
|
+
when 'text'
|
32
|
+
raise Vonage::ClientError.new(":message must be a String") unless message.is_a? String
|
33
|
+
when 'image'
|
34
|
+
raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
|
35
|
+
raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Vonage
|
4
|
+
class Messaging::Channels::WhatsApp < Messaging::Message
|
5
|
+
MESSAGE_TYPES = ['text', 'image', 'audio', 'video', 'file', 'template', 'custom']
|
6
|
+
|
7
|
+
attr_reader :data
|
8
|
+
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@type = attributes.fetch(:type, nil)
|
11
|
+
@message = attributes.fetch(:message, nil)
|
12
|
+
@opts = attributes.fetch(:opts, {})
|
13
|
+
@data = {}
|
14
|
+
|
15
|
+
after_initialize!
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def build
|
21
|
+
data[:channel] = 'whatsapp'
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def verify_type
|
26
|
+
raise ClientError.new("Invalid message type") unless MESSAGE_TYPES.include?(type)
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_message
|
30
|
+
case type
|
31
|
+
when 'text'
|
32
|
+
raise Vonage::ClientError.new(":message must be a String") unless message.is_a? String
|
33
|
+
when 'template'
|
34
|
+
raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
|
35
|
+
raise Vonage::ClientError.new(":name is required in :template") unless message[:name]
|
36
|
+
raise Vonage::ClientError.new(":whatsapp is required in :opts") unless opts[:whatsapp]
|
37
|
+
raise Vonage::ClientError.new(":policy is required in :whatsapp") unless opts[:whatsapp][:policy]
|
38
|
+
raise Vonage::ClientError.new(":locale is required in :whatsapp") unless opts[:whatsapp][:locale]
|
39
|
+
when 'custom'
|
40
|
+
raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
|
41
|
+
else
|
42
|
+
raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
|
43
|
+
raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
module Vonage
|
4
|
+
class Messaging::Message
|
5
|
+
CHANNELS = {
|
6
|
+
sms: Vonage::Messaging::Channels::SMS,
|
7
|
+
mms: Vonage::Messaging::Channels::MMS,
|
8
|
+
whatsapp: Vonage::Messaging::Channels::WhatsApp,
|
9
|
+
messenger: Vonage::Messaging::Channels::Messenger,
|
10
|
+
viber: Vonage::Messaging::Channels::Viber
|
11
|
+
}
|
12
|
+
|
13
|
+
class << self
|
14
|
+
CHANNELS.keys.each do |method|
|
15
|
+
define_method method do |attributes|
|
16
|
+
CHANNELS[method].new(**attributes).data
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.method_missing(method)
|
22
|
+
raise ClientError.new("Messaging channel must be one of the valid options.")
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_accessor :type, :message, :opts
|
28
|
+
attr_writer :data
|
29
|
+
|
30
|
+
def after_initialize!
|
31
|
+
verify_type
|
32
|
+
verify_message
|
33
|
+
build
|
34
|
+
end
|
35
|
+
|
36
|
+
def build
|
37
|
+
data[:message_type] = type
|
38
|
+
data[type.to_sym] = message
|
39
|
+
data.merge!(opts)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Vonage
|
5
|
+
class Messaging < Namespace
|
6
|
+
self.authentication = BearerToken
|
7
|
+
|
8
|
+
self.request_body = JSON
|
9
|
+
|
10
|
+
# Send a Message.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# message = Vonage::Messaging::Message.sms(message: "Hello world!")
|
14
|
+
# response = client.messaging.send(to: "447700900000", from: "447700900001", **message)
|
15
|
+
#
|
16
|
+
# @option params [required, String] :to
|
17
|
+
#
|
18
|
+
# @option params [required, String] :from
|
19
|
+
#
|
20
|
+
# @option params [required, Hash] **message
|
21
|
+
# The Vonage Message object to use for this message.
|
22
|
+
#
|
23
|
+
# @see https://developer.vonage.com/api/messages-olympus#SendMessage
|
24
|
+
#
|
25
|
+
def send(params)
|
26
|
+
request('/v1/messages', params: params, type: Post)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/vonage/version.rb
CHANGED
data/lib/vonage.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vonage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vonage
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nexmo-jwt
|
@@ -126,6 +126,13 @@ files:
|
|
126
126
|
- lib/vonage/keys.rb
|
127
127
|
- lib/vonage/logger.rb
|
128
128
|
- lib/vonage/messages.rb
|
129
|
+
- lib/vonage/messaging.rb
|
130
|
+
- lib/vonage/messaging/channels/messenger.rb
|
131
|
+
- lib/vonage/messaging/channels/mms.rb
|
132
|
+
- lib/vonage/messaging/channels/sms.rb
|
133
|
+
- lib/vonage/messaging/channels/viber.rb
|
134
|
+
- lib/vonage/messaging/channels/whats_app.rb
|
135
|
+
- lib/vonage/messaging/message.rb
|
129
136
|
- lib/vonage/namespace.rb
|
130
137
|
- lib/vonage/number_insight.rb
|
131
138
|
- lib/vonage/numbers.rb
|
@@ -184,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
191
|
- !ruby/object:Gem::Version
|
185
192
|
version: '0'
|
186
193
|
requirements: []
|
187
|
-
rubygems_version: 3.3
|
194
|
+
rubygems_version: 3.2.3
|
188
195
|
signing_key:
|
189
196
|
specification_version: 4
|
190
197
|
summary: This is the Ruby Server SDK for Vonage APIs. To use it you'll need a Vonage
|