messagebird-rest 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 206da8f9eaa52678002b0aab12ebb8f7be356157
4
- data.tar.gz: 9d7edf4b0e0c2008bac7d5fa5553efddbbce8a56
3
+ metadata.gz: d8af99a7a5eb2bb8576cfe1e880ed6443a13a962
4
+ data.tar.gz: c86b5b379a2e012af6494de574619ac0b0af5cc6
5
5
  SHA512:
6
- metadata.gz: a2c069495f203d33f17104158b10f205c97e54b94ef7abf5a60b1b8e84c53388f5adb11ef814ceed65b63fce2754b9a2616f913a778bf75e2a2bfb7e9680608e
7
- data.tar.gz: a9894ef70649c9b0d933470c2447757f87170f0852b573256cb484710092ed76575237d46d80dcf8f2167a759c1256657d7ef41becbd346a7ec866d52b4e21bd
6
+ metadata.gz: a223e47afb796eb24c1cba0ff1cb8d50d3a695f1586f2805703050692631076fd98392a024b30c701ff246c8184a5ad2f19a6c747cffcd3f2d6a1d9ac74fd85d
7
+ data.tar.gz: 879e546638600315f1dcb2bf3dbc45cd82f08d4f8ae7fa7949be49d26a50abe956571c711bb696adfc5a0a15ff8ae708350e5c5b5e85a25964aed9242aa8da24
@@ -2,8 +2,7 @@ libdir = File.dirname(__FILE__)
2
2
  $:.unshift(libdir) unless $:.include?(libdir)
3
3
 
4
4
  module MessageBird
5
- CLIENT_VERSION = '1.4.1'
6
- ENDPOINT = 'https://rest.messagebird.com'
5
+ CLIENT_VERSION = '1.4.2'
7
6
  end
8
7
 
9
8
  require 'messagebird/balance'
@@ -14,6 +13,7 @@ require 'messagebird/group_reference'
14
13
  require 'messagebird/hlr'
15
14
  require 'messagebird/http_client'
16
15
  require 'messagebird/message_reference'
16
+ require 'messagebird/signed_request'
17
17
  require 'messagebird/verify'
18
18
  require 'messagebird/message'
19
19
  require 'messagebird/voicemessage'
@@ -4,6 +4,10 @@ require 'uri'
4
4
 
5
5
  require 'messagebird/balance'
6
6
  require 'messagebird/contact'
7
+ require 'messagebird/conversation'
8
+ require 'messagebird/conversation_client'
9
+ require 'messagebird/conversation_message'
10
+ require 'messagebird/conversation_webhook'
7
11
  require 'messagebird/error'
8
12
  require 'messagebird/group'
9
13
  require 'messagebird/hlr'
@@ -24,20 +28,28 @@ module MessageBird
24
28
  end
25
29
 
26
30
  class Client
27
-
28
- attr_reader :access_key
29
- attr_reader :http_client
31
+ attr_reader :access_key, :http_client, :conversation_client
30
32
 
31
33
  def initialize(access_key = nil, http_client = nil)
32
34
  @access_key = access_key || ENV['MESSAGEBIRD_ACCESS_KEY']
33
35
  @http_client = http_client || HttpClient.new(@access_key)
36
+ @conversation_client = http_client || ConversationClient.new(@access_key)
37
+ end
38
+
39
+ def conversation_request(method, path, params={})
40
+ response_body = @conversation_client.request(method, path, params)
41
+ return if response_body.nil? || response_body.empty?
42
+ parse_body(response_body)
34
43
  end
35
44
 
36
45
  def request(method, path, params={})
37
46
  response_body = @http_client.request(method, path, params)
38
47
  return if response_body.empty?
48
+ parse_body(response_body)
49
+ end
39
50
 
40
- json = JSON.parse(response_body)
51
+ def parse_body(body)
52
+ json = JSON.parse(body)
41
53
 
42
54
  # If the request returned errors, create Error objects and raise.
43
55
  if json.has_key?('errors')
@@ -47,6 +59,79 @@ module MessageBird
47
59
  json
48
60
  end
49
61
 
62
+ ## Conversations
63
+ # Send a conversation message
64
+ def send_conversation_message(from, to, params={})
65
+ ConversationMessage.new(conversation_request(
66
+ :post,
67
+ 'send',
68
+ params.merge({
69
+ :from => from,
70
+ :to => to,
71
+ })))
72
+ end
73
+
74
+ # Start a conversation
75
+ def start_conversation(to, channelId, params={})
76
+ Conversation.new(conversation_request(
77
+ :post,
78
+ 'conversations/start',
79
+ params.merge({
80
+ :to => to,
81
+ :channelId => channelId,
82
+ })))
83
+ end
84
+
85
+ def conversation_list(limit = 0, offset = 0)
86
+ List.new(Conversation, conversation_request(:get, "conversations?limit=#{limit}&offset=#{offset}"))
87
+ end
88
+
89
+ def conversation(id)
90
+ Conversation.new(conversation_request(:get, "conversations/#{id}"))
91
+ end
92
+
93
+ def conversation_update(id, status)
94
+ Conversation.new(conversation_request(:patch, "conversations/#{id}", :status => status))
95
+ end
96
+
97
+ def conversation_reply(id, params={})
98
+ ConversationMessage.new(conversation_request(:post, "conversations/#{id}/messages", params))
99
+ end
100
+
101
+ def conversation_messages_list(id, limit=0, offset=0)
102
+ List.new(ConversationMessage, conversation_request(:get, "conversations/#{id}/messages?limit=#{limit}&offset=#{offset}"))
103
+ end
104
+
105
+ def conversation_message(id)
106
+ ConversationMessage.new(conversation_request(:get, "messages/#{id}"))
107
+ end
108
+
109
+ def conversation_webhook_create(channelId, url, events=[])
110
+ ConversationWebhook.new(conversation_request(
111
+ :post,
112
+ "webhooks",
113
+ :channelId => channelId,
114
+ :url => url,
115
+ :events => events
116
+ ))
117
+ end
118
+
119
+ def conversation_webhooks_list(limit=0, offset=0)
120
+ List.new(ConversationWebhook, conversation_request(:get,"webhooks?limit=#{limit}&offset=#{offset}"))
121
+ end
122
+
123
+ def conversation_webhook_update(id, params={})
124
+ ConversationWebhook.new(conversation_request(:patch,"webhooks/#{id}",params))
125
+ end
126
+
127
+ def conversation_webhook(id)
128
+ ConversationWebhook.new(conversation_request(:get,"webhooks/#{id}"))
129
+ end
130
+
131
+ def conversation_webhook_delete(id)
132
+ conversation_request(:delete,"webhooks/#{id}")
133
+ end
134
+
50
135
  # Retrieve your balance.
51
136
  def balance
52
137
  Balance.new(request(:get, 'balance'))
@@ -5,8 +5,8 @@ require 'messagebird/message_reference'
5
5
 
6
6
  module MessageBird
7
7
  class Contact < MessageBird::Base
8
- attr_accessor :id, :href, :msisdn, :firstName, :lastName, :customDetails,
9
- :groups, :messages, :createdDatetime, :updatedDatetime
8
+ attr_accessor :id, :href, :msisdn, :firstName, :lastName
9
+ attr_reader :customDetails, :groups, :messages, :createdDatetime, :updatedDatetime
10
10
 
11
11
  def customDetails=(value)
12
12
  @customDetails = MessageBird::CustomDetails.new(value)
@@ -28,4 +28,4 @@ module MessageBird
28
28
  @updatedDatetime = value_to_time(value)
29
29
  end
30
30
  end
31
- end
31
+ end
@@ -0,0 +1,42 @@
1
+ require 'messagebird/base'
2
+ require 'messagebird/contact'
3
+ require 'messagebird/conversation_channel'
4
+
5
+ module MessageBird
6
+ class Conversation < MessageBird::Base
7
+ attr_accessor :id, :status, :lastUsedChannelId, :contactId
8
+ attr_reader :contact, :channels, :messages, :createdDatetime,
9
+ :updatedDatetime, :lastReceivedDatetime
10
+
11
+ CONVERSATION_STATUS_ACTIVE = 'active'
12
+ CONVERSATION_STATUS_ARCHIVED = 'archived'
13
+ WEBHOOK_EVENT_CONVERSATION_CREATED = 'conversation.created'
14
+ WEBHOOK_EVENT_CONVERSATION_UPDATED = 'conversation.updated'
15
+ WEBHOOK_EVENT_MESSAGE_CREATED = 'message.created'
16
+ WEBHOOK_EVENT_MESSAGE_UPDATED = 'message.updated'
17
+
18
+ def contact=(value)
19
+ @contact = Contact.new(value)
20
+ end
21
+
22
+ def channels=(json)
23
+ @channels = json.map { |c| MessageBird::ConversationChannel.new(c) }
24
+ end
25
+
26
+ def messages=(value)
27
+ @messages = MessageBird::MessageReference.new(value)
28
+ end
29
+
30
+ def createdDatetime=(value)
31
+ @createdDatetime = value_to_time(value)
32
+ end
33
+
34
+ def updatedDatetime=(value)
35
+ @updatedDatetime = value_to_time(value)
36
+ end
37
+
38
+ def lastReceivedDatetime=(value)
39
+ @lastReceivedDatetime = value_to_time(value)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,17 @@
1
+ require 'messagebird/base'
2
+
3
+ module MessageBird
4
+ class ConversationChannel < MessageBird::Base
5
+ attr_accessor :id, :name, :platformId, :status
6
+ attr_reader :createdDatetime, :updatedDatetime
7
+
8
+ def createdDatetime=(value)
9
+ @createdDatetime = value_to_time(value)
10
+ end
11
+
12
+ def updatedDatetime=(value)
13
+ @updatedDatetime = value_to_time(value)
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ require 'net/https'
2
+ require 'uri'
3
+ require 'json'
4
+ require 'messagebird/http_client'
5
+
6
+ module MessageBird
7
+ class ConversationClient < HttpClient
8
+ ENDPOINT = 'https://conversations.messagebird.com/v1/'
9
+
10
+ def endpoint()
11
+ ENDPOINT
12
+ end
13
+
14
+ def prepare_request(request, params={})
15
+ request.body = params.to_json
16
+ request
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ require 'messagebird/base'
2
+
3
+ module MessageBird
4
+ class ConversationMessage < MessageBird::Base
5
+ attr_accessor :id, :conversationId, :channelId, :direction, :status,
6
+ :type, :content, :createdDatetime, :updatedDatetime, :fallback
7
+
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ require 'messagebird/base'
2
+
3
+ module MessageBird
4
+ class ConversationWebhook < MessageBird::Base
5
+ attr_accessor :id, :events, :channelId, :url, :status, :createdDatetime, :updatedDatetime
6
+ end
7
+ end
@@ -3,8 +3,8 @@ require 'messagebird/contact_reference'
3
3
 
4
4
  module MessageBird
5
5
  class Group < MessageBird::Base
6
- attr_accessor :id, :href, :name, :contacts, :createdDatetime,
7
- :updatedDatetime
6
+ attr_accessor :id, :href, :name
7
+ attr_reader :contacts, :createdDatetime, :updatedDatetime
8
8
 
9
9
  def contacts=(value)
10
10
  @contacts = MessageBird::ContactReference.new(value)
@@ -18,4 +18,4 @@ module MessageBird
18
18
  @updatedDatetime = value_to_time(value)
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -4,8 +4,8 @@ require 'messagebird/base'
4
4
 
5
5
  module MessageBird
6
6
  class HLR < MessageBird::Base
7
- attr_accessor :id, :href, :msisdn, :network, :reference, :status,
8
- :details, :createdDatetime, :statusDatetime
7
+ attr_accessor :id, :href, :msisdn, :network, :reference, :status, :details
8
+ attr_reader :createdDatetime, :statusDatetime
9
9
 
10
10
  def createdDatetime=(value)
11
11
  @createdDatetime = value_to_time(value)
@@ -8,21 +8,30 @@ module MessageBird
8
8
  class MethodNotAllowedException < ArgumentError; end
9
9
 
10
10
  class HttpClient
11
-
12
11
  attr_reader :access_key
13
12
 
13
+ ENDPOINT = 'https://rest.messagebird.com/'
14
+
14
15
  def initialize(access_key)
15
16
  @access_key = access_key
16
17
  end
17
18
 
19
+ def endpoint()
20
+ ENDPOINT
21
+ end
22
+
18
23
  def request(method, path, params={}, check_json=true)
19
- uri = URI.join(ENDPOINT, '/', path)
24
+ uri = URI.join(endpoint, path)
20
25
 
21
26
  # Set up the HTTP object.
22
27
  http = Net::HTTP.new(uri.host, uri.port)
23
- http.use_ssl = true
28
+ http.use_ssl = true
29
+
30
+ unless ENV['DEBUG_MB_HTTP_CLIENT'].nil?
31
+ http.set_debug_output($stdout)
32
+ end
24
33
 
25
- request = prepare_request(method, uri, params)
34
+ request = build_request(method, uri, params)
26
35
 
27
36
  # Execute the request and fetch the response.
28
37
  response = http.request(request)
@@ -33,7 +42,12 @@ module MessageBird
33
42
  response.body
34
43
  end
35
44
 
36
- def prepare_request(method, uri, params={})
45
+ def prepare_request(request, params={})
46
+ request.set_form_data(params)
47
+ request
48
+ end
49
+
50
+ def build_request(method, uri, params={})
37
51
  # Construct the HTTP request.
38
52
  case method
39
53
  when :delete
@@ -52,8 +66,9 @@ module MessageBird
52
66
  request['Authorization'] = "AccessKey #{@access_key}"
53
67
  request['User-Agent'] = "MessageBird/ApiClient/#{CLIENT_VERSION} Ruby/#{RUBY_VERSION}"
54
68
 
55
- request.set_form_data(params) if [:patch, :post].include?(method) && !params.empty?
56
-
69
+ if [:patch, :post].include?(method) && !params.empty?
70
+ prepare_request(request, params)
71
+ end
57
72
  request
58
73
  end
59
74
 
@@ -63,7 +78,7 @@ module MessageBird
63
78
  # InvalidPhoneNumberException does not make a lot of sense here, but it's
64
79
  # needed to maintain backwards compatibility. See issue:
65
80
  # https://github.com/messagebird/ruby-rest-api/issues/17
66
- expected_codes = [200, 201, 204, 401, 404, 405, 422]
81
+ expected_codes = [200, 201, 202, 204, 401, 404, 405, 422]
67
82
  raise InvalidPhoneNumberException, 'Unknown response from server' unless expected_codes.include? code
68
83
  end
69
84
 
@@ -77,4 +92,4 @@ module MessageBird
77
92
 
78
93
  end
79
94
 
80
- end
95
+ end
@@ -1,7 +1,6 @@
1
1
  require 'messagebird/base'
2
2
 
3
3
  class List < MessageBird::Base
4
-
5
4
  attr_accessor :offset, :limit, :count, :totalCount, :links, :items
6
5
 
7
6
  # type will be used to create objects for the items, e.g.
@@ -20,4 +19,4 @@ class List < MessageBird::Base
20
19
  @items[index]
21
20
  end
22
21
 
23
- end
22
+ end
@@ -3,9 +3,9 @@ require 'messagebird/recipient'
3
3
 
4
4
  module MessageBird
5
5
  class Message < MessageBird::Base
6
- attr_accessor :id, :href, :direction, :type, :originator, :body,
7
- :reference, :validity, :gateway, :typeDetails, :datacoding,
8
- :mclass, :scheduledDatetime, :createdDatetime, :recipients
6
+ attr_accessor :id, :href, :direction, :type, :originator, :body, :reference,
7
+ :validity, :gateway, :typeDetails, :datacoding, :mclass
8
+ attr_reader :scheduledDatetime, :createdDatetime, :recipients
9
9
 
10
10
  def scheduledDatetime=(value)
11
11
  @scheduledDatetime = value_to_time(value)
@@ -2,7 +2,8 @@ require 'messagebird/base'
2
2
 
3
3
  module MessageBird
4
4
  class Recipient < MessageBird::Base
5
- attr_accessor :recipient, :status, :statusDatetime
5
+ attr_accessor :recipient, :status
6
+ attr_reader :statusDatetime
6
7
 
7
8
  def statusDatetime=(value)
8
9
  @statusDatetime = value_to_time(value)
@@ -0,0 +1,47 @@
1
+ require 'base64'
2
+ require 'digest'
3
+ require 'time'
4
+
5
+ module MessageBird
6
+ class ValidationException < TypeError;
7
+ end
8
+
9
+ class SignedRequest
10
+ def initialize(queryParameters, signature, requestTimestamp, body)
11
+
12
+ if !queryParameters.is_a? Hash
13
+ raise ValidationException, 'The "queryParameters" value is invalid.'
14
+ end
15
+ if !signature.is_a? String
16
+ raise ValidationException, 'The "signature" value is invalid.'
17
+ end
18
+ if !requestTimestamp.is_a? Integer
19
+ raise ValidationException, 'The "requestTimestamp" value is invalid.'
20
+ end
21
+ if !body.is_a? String
22
+ raise ValidationException, 'The "body" value is invalid.'
23
+ end
24
+
25
+ @queryParameters, @signature, @requestTimestamp, @body = queryParameters, signature, requestTimestamp, body
26
+ end
27
+
28
+ def verify(signingKey)
29
+ calculatedSignature = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), signingKey, buildPayload)
30
+ expectedSignature = Base64.decode64(@signature)
31
+ calculatedSignature.bytes == expectedSignature.bytes
32
+ end
33
+
34
+ def buildPayload
35
+ parts = []
36
+ parts.push(@requestTimestamp)
37
+ parts.push(URI.encode_www_form(@queryParameters.sort))
38
+ parts.push(Digest::SHA256.new.digest @body)
39
+ parts.join("\n")
40
+ end
41
+
42
+ def isRecent(offset = 10)
43
+ (Time.now.getutc.to_i - @requestTimestamp) < offset;
44
+ end
45
+
46
+ end
47
+ end
@@ -4,8 +4,8 @@ require 'messagebird/base'
4
4
 
5
5
  module MessageBird
6
6
  class Verify < MessageBird::Base
7
- attr_accessor :id, :recipient, :reference, :status, :href,
8
- :createdDatetime, :validUntilDatetime
7
+ attr_accessor :id, :recipient, :reference, :status, :href
8
+ attr_reader :createdDatetime, :validUntilDatetime
9
9
 
10
10
  def createdDatetime=(value)
11
11
  @createdDatetime = value_to_time(value)
@@ -3,9 +3,8 @@ require 'messagebird/recipient'
3
3
 
4
4
  module MessageBird
5
5
  class VoiceMessage < MessageBird::Base
6
- attr_accessor :id, :href, :originator, :body, :reference, :language, :voice, :repeat,
7
- :ifMachine, :scheduledDatetime, :createdDatetime, :recipients
8
-
6
+ attr_accessor :id, :href, :originator, :body, :reference, :language, :voice, :repeat, :ifMachine
7
+ attr_reader :scheduledDatetime, :createdDatetime, :recipients
9
8
 
10
9
  def scheduledDatetime=(value)
11
10
  @scheduledDatetime = value_to_time(value)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: messagebird-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maurice Nonnekes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-16 00:00:00.000000000 Z
11
+ date: 2019-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -38,6 +38,11 @@ files:
38
38
  - lib/messagebird/client.rb
39
39
  - lib/messagebird/contact.rb
40
40
  - lib/messagebird/contact_reference.rb
41
+ - lib/messagebird/conversation.rb
42
+ - lib/messagebird/conversation_channel.rb
43
+ - lib/messagebird/conversation_client.rb
44
+ - lib/messagebird/conversation_message.rb
45
+ - lib/messagebird/conversation_webhook.rb
41
46
  - lib/messagebird/custom_details.rb
42
47
  - lib/messagebird/error.rb
43
48
  - lib/messagebird/group.rb
@@ -49,6 +54,7 @@ files:
49
54
  - lib/messagebird/message.rb
50
55
  - lib/messagebird/message_reference.rb
51
56
  - lib/messagebird/recipient.rb
57
+ - lib/messagebird/signed_request.rb
52
58
  - lib/messagebird/verify.rb
53
59
  - lib/messagebird/voicemessage.rb
54
60
  homepage: https://github.com/messagebird/ruby-rest-api