messagebird-rest 1.3.2 → 2.0.0

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.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +67 -17
  3. data/lib/messagebird.rb +16 -7
  4. data/lib/messagebird/balance.rb +2 -0
  5. data/lib/messagebird/base.rb +12 -7
  6. data/lib/messagebird/call_flow.rb +22 -0
  7. data/lib/messagebird/call_flow/step.rb +9 -0
  8. data/lib/messagebird/callflow.rb +60 -0
  9. data/lib/messagebird/client.rb +420 -73
  10. data/lib/messagebird/contact.rb +33 -0
  11. data/lib/messagebird/contact_reference.rb +9 -0
  12. data/lib/messagebird/conversation.rb +44 -0
  13. data/lib/messagebird/conversation_channel.rb +18 -0
  14. data/lib/messagebird/conversation_client.rb +22 -0
  15. data/lib/messagebird/conversation_message.rb +10 -0
  16. data/lib/messagebird/conversation_webhook.rb +9 -0
  17. data/lib/messagebird/custom_details.rb +10 -0
  18. data/lib/messagebird/error.rb +2 -0
  19. data/lib/messagebird/group.rb +23 -0
  20. data/lib/messagebird/group_reference.rb +9 -0
  21. data/lib/messagebird/hlr.rb +8 -6
  22. data/lib/messagebird/http_client.rb +95 -0
  23. data/lib/messagebird/list.rb +24 -0
  24. data/lib/messagebird/lookup.rb +7 -5
  25. data/lib/messagebird/message.rb +9 -7
  26. data/lib/messagebird/message_reference.rb +9 -0
  27. data/lib/messagebird/number.rb +18 -0
  28. data/lib/messagebird/number_client.rb +22 -0
  29. data/lib/messagebird/recipient.rb +6 -3
  30. data/lib/messagebird/signed_request.rb +50 -0
  31. data/lib/messagebird/verify.rb +20 -0
  32. data/lib/messagebird/version.rb +7 -0
  33. data/lib/messagebird/voice/base.rb +16 -0
  34. data/lib/messagebird/voice/call.rb +22 -0
  35. data/lib/messagebird/voice/call_leg.rb +11 -0
  36. data/lib/messagebird/voice/call_leg_recording.rb +20 -0
  37. data/lib/messagebird/voice/client.rb +22 -0
  38. data/lib/messagebird/voice/list.rb +24 -0
  39. data/lib/messagebird/voice/transcription.rb +15 -0
  40. data/lib/messagebird/voice/webhook.rb +11 -0
  41. data/lib/messagebird/voice_client.rb +25 -0
  42. data/lib/messagebird/voicemessage.rb +8 -7
  43. metadata +85 -15
  44. data/lib/messagebird/otp.rb +0 -18
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+ require 'messagebird/custom_details'
5
+ require 'messagebird/group_reference'
6
+ require 'messagebird/message_reference'
7
+
8
+ module MessageBird
9
+ class Contact < MessageBird::Base
10
+ attr_accessor :id, :href, :msisdn, :first_name, :last_name
11
+ attr_reader :custom_details, :groups, :messages, :created_datetime, :updated_datetime
12
+
13
+ def custom_details=(value)
14
+ @custom_details = MessageBird::CustomDetails.new(value)
15
+ end
16
+
17
+ def groups=(value)
18
+ @groups = MessageBird::GroupReference.new(value)
19
+ end
20
+
21
+ def messages=(value)
22
+ @messages = MessageBird::MessageReference.new(value)
23
+ end
24
+
25
+ def created_datetime=(value)
26
+ @created_datetime = value_to_time(value)
27
+ end
28
+
29
+ def updated_datetime=(value)
30
+ @updated_datetime = value_to_time(value)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class ContactReference < MessageBird::Base
7
+ attr_accessor :href, :total_count
8
+ end
9
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+ require 'messagebird/contact'
5
+ require 'messagebird/conversation_channel'
6
+
7
+ module MessageBird
8
+ class Conversation < MessageBird::Base
9
+ attr_accessor :id, :status, :last_used_channel_id, :contact_id
10
+ attr_reader :contact, :channels, :messages, :created_datetime,
11
+ :updated_datetime, :last_received_datetime
12
+
13
+ CONVERSATION_STATUS_ACTIVE = 'active'
14
+ CONVERSATION_STATUS_ARCHIVED = 'archived'
15
+ WEBHOOK_EVENT_CONVERSATION_CREATED = 'conversation.created'
16
+ WEBHOOK_EVENT_CONVERSATION_UPDATED = 'conversation.updated'
17
+ WEBHOOK_EVENT_MESSAGE_CREATED = 'message.created'
18
+ WEBHOOK_EVENT_MESSAGE_UPDATED = 'message.updated'
19
+
20
+ def contact=(value)
21
+ @contact = Contact.new(value)
22
+ end
23
+
24
+ def channels=(json)
25
+ @channels = json.map { |c| MessageBird::ConversationChannel.new(c) }
26
+ end
27
+
28
+ def messages=(value)
29
+ @messages = MessageBird::MessageReference.new(value)
30
+ end
31
+
32
+ def created_datetime=(value)
33
+ @created_datetime = value_to_time(value)
34
+ end
35
+
36
+ def updated_datetime=(value)
37
+ @updated_datetime = value_to_time(value)
38
+ end
39
+
40
+ def last_received_datetime=(value)
41
+ @last_received_datetime = value_to_time(value)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class ConversationChannel < MessageBird::Base
7
+ attr_accessor :id, :name, :platform_id, :status
8
+ attr_reader :created_datetime, :updated_datetime
9
+
10
+ def created_datetime=(value)
11
+ @created_datetime = value_to_time(value)
12
+ end
13
+
14
+ def updated_datetime=(value)
15
+ @updated_datetime = value_to_time(value)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/https'
4
+ require 'uri'
5
+ require 'json'
6
+ require 'messagebird/http_client'
7
+
8
+ module MessageBird
9
+ class ConversationClient < HttpClient
10
+ ENDPOINT = 'https://conversations.messagebird.com/v1/'
11
+
12
+ def prepare_request(request, params = {})
13
+ request['Content-Type'] = 'application/json'
14
+ request.body = params.to_json
15
+ request
16
+ end
17
+ end
18
+
19
+ def endpoint
20
+ ENDPOINT
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class ConversationMessage < MessageBird::Base
7
+ attr_accessor :id, :conversation_id, :channel_id, :direction, :status,
8
+ :type, :content, :created_datetime, :updated_datetime, :fallback
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class ConversationWebhook < MessageBird::Base
7
+ attr_accessor :id, :events, :channel_id, :url, :status, :created_datetime, :updated_datetime
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class CustomDetails < MessageBird::Base
7
+ # CustomDetails holds free-input fields for the Contact object.
8
+ attr_accessor :custom1, :custom2, :custom3, :custom4
9
+ end
10
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'messagebird/base'
2
4
 
3
5
  module MessageBird
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+ require 'messagebird/contact_reference'
5
+
6
+ module MessageBird
7
+ class Group < MessageBird::Base
8
+ attr_accessor :id, :href, :name
9
+ attr_reader :contacts, :created_datetime, :updated_datetime
10
+
11
+ def contacts=(value)
12
+ @contacts = MessageBird::ContactReference.new(value)
13
+ end
14
+
15
+ def created_datetime=(value)
16
+ @created_datetime = value_to_time(value)
17
+ end
18
+
19
+ def updated_datetime=(value)
20
+ @updated_datetime = value_to_time(value)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class GroupReference < MessageBird::Base
7
+ attr_accessor :href, :total_count
8
+ end
9
+ end
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'time'
2
4
 
3
5
  require 'messagebird/base'
4
6
 
5
7
  module MessageBird
6
8
  class HLR < MessageBird::Base
7
- attr_accessor :id, :href, :msisdn, :network, :reference, :status,
8
- :details, :createdDatetime, :statusDatetime
9
+ attr_accessor :id, :href, :msisdn, :network, :reference, :status, :details
10
+ attr_reader :created_datetime, :status_datetime
9
11
 
10
- def createdDatetime=(value)
11
- @createdDatetime = value_to_time(value)
12
+ def created_datetime=(value)
13
+ @created_datetime = value_to_time(value)
12
14
  end
13
15
 
14
- def statusDatetime=(value)
15
- @statusDatetime = value_to_time(value)
16
+ def status_datetime=(value)
17
+ @status_datetime = value_to_time(value)
16
18
  end
17
19
  end
18
20
  end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/https'
4
+ require 'uri'
5
+
6
+ module MessageBird
7
+ class ServerException < StandardError; end
8
+ class InvalidResponseException < StandardError; end
9
+ class MethodNotAllowedException < ArgumentError; end
10
+
11
+ class HttpClient
12
+ attr_reader :access_key
13
+
14
+ VALID_RESPONSE_CODES = [200, 201, 202, 204, 401, 404, 405, 422].freeze
15
+ ENDPOINT = 'https://rest.messagebird.com/'
16
+ SUBMIT_METHODS = [:patch, :post, :put].freeze
17
+ ALLOWED_METHODS = SUBMIT_METHODS.dup + [:get, :delete].freeze
18
+
19
+ def initialize(access_key)
20
+ @access_key = access_key
21
+ end
22
+
23
+ def endpoint
24
+ ENDPOINT
25
+ end
26
+
27
+ def build_http_client(uri)
28
+ http = Net::HTTP.new(uri.host, uri.port)
29
+ http.use_ssl = true
30
+
31
+ http.set_debug_output($stdout) unless ENV['DEBUG_MB_HTTP_CLIENT'].nil?
32
+
33
+ http
34
+ end
35
+
36
+ def request(method, path, params = {}, check_json = true)
37
+ uri = URI.join(endpoint, path)
38
+ http = build_http_client(uri)
39
+ request = build_request(method, uri, params)
40
+
41
+ # Execute the request and fetch the response.
42
+ response = http.request(request)
43
+
44
+ assert_valid_response_code(response.code.to_i)
45
+ assert_json_response_type(response['Content-Type']) unless check_json
46
+
47
+ response.body
48
+ end
49
+
50
+ def request_block(method, path, params = {}, &block)
51
+ uri = URI.join(endpoint, path)
52
+ http = build_http_client(uri)
53
+ request = build_request(method, uri, params)
54
+
55
+ http.request(request, block)
56
+ end
57
+
58
+ def prepare_request(request, params = {})
59
+ request.set_form_data(params)
60
+
61
+ request
62
+ end
63
+
64
+ def build_request(method, uri, params = {})
65
+ # Construct the HTTP request.
66
+ raise MethodNotAllowedException unless ALLOWED_METHODS.include?(method)
67
+
68
+ request = Class.const_get("Net::HTTP::#{method.to_s.capitalize}").new(uri.request_uri)
69
+
70
+ request['Accept'] = 'application/json'
71
+ request['Authorization'] = "AccessKey #{@access_key}"
72
+ request['User-Agent'] = "MessageBird/ApiClient/#{Version::STRING} Ruby/#{RUBY_VERSION}"
73
+
74
+ if SUBMIT_METHODS.include?(method) && !params.empty?
75
+ prepare_request(request, params)
76
+ end
77
+
78
+ request
79
+ end
80
+
81
+ # Throw an exception if the response code is not one we expect from the
82
+ # MessageBird API.
83
+ def assert_valid_response_code(code)
84
+ raise ServerException, 'Unknown response from server' unless VALID_RESPONSE_CODES.include? code
85
+ end
86
+
87
+ # Throw an exception if the response's content type is not JSON. This only
88
+ # checks the header: it doesn't inspect the actual body.
89
+ def assert_json_response_type(content_type)
90
+ # Check whether the header starts with application/json and don't check
91
+ # for equality: some API's may append the charset to this header.
92
+ raise InvalidResponseException, 'Response is not JSON' unless content_type.start_with? 'application/json'
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ class List < MessageBird::Base
6
+ attr_accessor :offset, :limit, :count, :total_count, :links
7
+ attr_reader :items
8
+
9
+ # type will be used to create objects for the items, e.g.
10
+ # List.new(Contact, {}).
11
+ def initialize(type, json)
12
+ @type = type
13
+
14
+ super(json)
15
+ end
16
+
17
+ def items=(value)
18
+ @items = value.map { |i| @type.new i }
19
+ end
20
+
21
+ def [](index)
22
+ @items[index]
23
+ end
24
+ end
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'time'
2
4
 
3
5
  require 'messagebird/base'
4
6
 
5
7
  module MessageBird
6
8
  class Lookup < MessageBird::Base
7
- attr_accessor :href, :countryCode, :countryPrefix, :phoneNumber, :type
9
+ attr_accessor :href, :country_code, :country_prefix, :phone_number, :type
8
10
  attr_reader :formats, :hlr
9
11
 
10
- def formats=(newFormats)
11
- @formats = Formats.new(newFormats)
12
+ def formats=(new_formats)
13
+ @formats = Formats.new(new_formats)
12
14
  end
13
15
 
14
- def hlr=(newHLR)
15
- @hlr = HLR.new(newHLR)
16
+ def hlr=(new_hlr)
17
+ @hlr = HLR.new(new_hlr)
16
18
  end
17
19
  end
18
20
 
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'messagebird/base'
2
4
  require 'messagebird/recipient'
3
5
 
4
6
  module MessageBird
5
7
  class Message < MessageBird::Base
6
- attr_accessor :id, :href, :direction, :type, :originator, :body,
7
- :reference, :validity, :gateway, :typeDetails, :datacoding,
8
- :mclass, :scheduledDatetime, :createdDatetime, :recipients
8
+ attr_accessor :id, :href, :direction, :type, :originator, :body, :reference,
9
+ :validity, :gateway, :typeDetails, :datacoding, :mclass
10
+ attr_reader :scheduled_date_time, :created_datetime, :recipients
9
11
 
10
- def scheduledDatetime=(value)
11
- @scheduledDatetime = value_to_time(value)
12
+ def scheduled_date_time=(value)
13
+ @scheduled_date_time = value_to_time(value)
12
14
  end
13
15
 
14
- def createdDatetime=(value)
15
- @createdDatetime = value_to_time(value)
16
+ def created_datetime=(value)
17
+ @created_datetime = value_to_time(value)
16
18
  end
17
19
 
18
20
  def recipients=(json)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class MessageReference < MessageBird::Base
7
+ attr_accessor :href, :total_count
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class Number < MessageBird::Base
7
+ attr_accessor :number, :country, :region, :locality, :features, :tags, :type, :status
8
+ attr_reader :created_at, :renewal_at
9
+
10
+ def created_at=(value)
11
+ @created_at = Time.parse(value)
12
+ end
13
+
14
+ def renewal_at=(value)
15
+ @renewal_at = Time.parse(value)
16
+ end
17
+ end
18
+ end