messagebird-rest 1.4.1 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
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