warb 0.1.2 → 1.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -12
  3. data/README.md +9 -32
  4. data/Rakefile +3 -3
  5. data/docs/README.md +1 -4
  6. data/docs/components/README.md +1 -4
  7. data/docs/messages/README.md +1 -2
  8. data/docs/messages/interactive_call_to_action_url.md +9 -9
  9. data/docs/messages/interactive_list.md +2 -2
  10. data/docs/messages/interactive_reply_button.md +9 -9
  11. data/examples/audio.rb +10 -10
  12. data/examples/document.rb +34 -34
  13. data/examples/image.rb +22 -22
  14. data/examples/interactive_call_to_action_url.rb +46 -46
  15. data/examples/interactive_list.rb +61 -61
  16. data/examples/interactive_reply_button.rb +43 -43
  17. data/examples/location.rb +32 -32
  18. data/examples/location_request.rb +11 -11
  19. data/examples/message.rb +8 -8
  20. data/examples/sticker.rb +10 -10
  21. data/examples/video.rb +22 -22
  22. data/examples/webhook.rb +42 -44
  23. data/lib/warb/client.rb +5 -7
  24. data/lib/warb/components/action.rb +8 -12
  25. data/lib/warb/configuration.rb +1 -4
  26. data/lib/warb/connection.rb +9 -15
  27. data/lib/warb/dispatcher.rb +3 -4
  28. data/lib/warb/dispatcher_concern.rb +0 -6
  29. data/lib/warb/indicator_dispatcher.rb +4 -4
  30. data/lib/warb/media_dispatcher.rb +10 -10
  31. data/lib/warb/resources/audio.rb +1 -1
  32. data/lib/warb/resources/contact.rb +20 -22
  33. data/lib/warb/resources/document.rb +1 -1
  34. data/lib/warb/resources/flow.rb +8 -10
  35. data/lib/warb/resources/image.rb +1 -1
  36. data/lib/warb/resources/interactive_call_to_action_url.rb +8 -10
  37. data/lib/warb/resources/interactive_list.rb +5 -7
  38. data/lib/warb/resources/interactive_reply_button.rb +8 -10
  39. data/lib/warb/resources/location.rb +1 -11
  40. data/lib/warb/resources/location_request.rb +3 -5
  41. data/lib/warb/resources/reaction.rb +1 -1
  42. data/lib/warb/resources/resource.rb +4 -12
  43. data/lib/warb/resources/sticker.rb +1 -1
  44. data/lib/warb/resources/text.rb +3 -21
  45. data/lib/warb/resources/video.rb +1 -1
  46. data/lib/warb/utils.rb +1 -3
  47. data/lib/warb/version.rb +1 -1
  48. data/lib/warb.rb +31 -50
  49. metadata +3 -29
  50. data/docs/components/button.md +0 -61
  51. data/docs/components/copy_code_button.md +0 -57
  52. data/docs/components/url_button.md +0 -57
  53. data/docs/messages/template.md +0 -327
  54. data/docs/resources/currency.md +0 -22
  55. data/docs/resources/date_time.md +0 -11
  56. data/docs/resources/index.md +0 -14
  57. data/docs/resources/text.md +0 -9
  58. data/lib/warb/components/button.rb +0 -29
  59. data/lib/warb/components/component.rb +0 -19
  60. data/lib/warb/components/copy_code_button.rb +0 -30
  61. data/lib/warb/components/quick_reply_button.rb +0 -15
  62. data/lib/warb/components/url_button.rb +0 -30
  63. data/lib/warb/components/voice_call_button.rb +0 -15
  64. data/lib/warb/errors.rb +0 -27
  65. data/lib/warb/language.rb +0 -8
  66. data/lib/warb/resources/currency.rb +0 -47
  67. data/lib/warb/resources/date_time.rb +0 -34
  68. data/lib/warb/resources/template.rb +0 -167
  69. data/lib/warb/response.rb +0 -33
  70. data/lib/warb/response_error_handler.rb +0 -42
  71. data/lib/warb/template_dispatcher.rb +0 -12
@@ -1,167 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Warb
4
- module Resources
5
- class Template < Resource
6
- attr_accessor :name, :language, :resources, :header, :buttons
7
-
8
- def initialize(**params)
9
- super
10
-
11
- @name = params[:name]
12
- @language = params[:language]
13
- @resources = params[:resources]
14
- @buttons = []
15
- end
16
-
17
- # rubocop:disable Metrics/MethodLength
18
- def build_payload
19
- {
20
- type: 'template',
21
- template: {
22
- name: name,
23
- language: {
24
- code: language
25
- },
26
- components: [
27
- component_header,
28
- component_body,
29
- *buttons
30
- ].compact
31
- }
32
- }
33
- end
34
- # rubocop:enable Metrics/MethodLength
35
-
36
- def add_currency_parameter(parameter_name = nil, **params, &)
37
- add_parameter(parameter_name, Currency.new(**params), &)
38
- end
39
-
40
- def add_date_time_parameter(parameter_name = nil, **params, &)
41
- add_parameter(parameter_name, DateTime.new(**params), &)
42
- end
43
-
44
- def add_text_parameter(parameter_name = nil, **params, &)
45
- add_parameter(parameter_name, Text.new(**params), &)
46
- end
47
-
48
- def add_text_header(content: nil, message: nil, text: nil, parameter_name: nil, &block)
49
- add_header(Text.new(content:, message:, text:, parameter_name:), &block)
50
- end
51
-
52
- def add_image_header(media_id: nil, link: nil, &block)
53
- add_header(Image.new(media_id:, link:), &block)
54
- end
55
-
56
- def add_document_header(media_id: nil, link: nil, filename: nil, &block)
57
- add_header(Document.new(media_id:, link:, filename:), &block)
58
- end
59
-
60
- def add_video_header(media_id: nil, link: nil, &block)
61
- add_header(Video.new(media_id:, link:), &block)
62
- end
63
-
64
- def add_location_header(latitude: nil, longitude: nil, address: nil, name: nil, &block)
65
- add_header(Location.new(latitude:, longitude:, address:, name:), &block)
66
- end
67
-
68
- def add_quick_reply_button(index: position, &block)
69
- add_button(Warb::Components::QuickReplyButton.new(index:), &block)
70
- end
71
-
72
- def add_dynamic_url_button(index: position, text: nil, &block)
73
- add_button(Warb::Components::UrlButton.new(index:, text:), &block)
74
- end
75
-
76
- alias add_auth_code_button add_dynamic_url_button
77
-
78
- def add_copy_code_button(index: position, coupon_code: nil, &block)
79
- add_button(Warb::Components::CopyCodeButton.new(index:, coupon_code:), &block)
80
- end
81
-
82
- def add_voice_call_button(index: position, &block)
83
- add_button(Warb::Components::VoiceCallButton.new(index:), &block)
84
- end
85
-
86
- def add_button(instance, &)
87
- return @buttons << instance.to_h unless block_given?
88
-
89
- @buttons << instance.tap(&).to_h
90
- end
91
-
92
- private
93
-
94
- def add_header(instance, &)
95
- @header = instance
96
-
97
- block_given? ? @header.tap(&) : @header
98
- end
99
-
100
- def component_header
101
- return unless header.is_a? Resource
102
-
103
- {
104
- type: 'header',
105
- parameters: [
106
- header.build_header
107
- ]
108
- }
109
- end
110
-
111
- def component_body
112
- return if resources.nil? || resources.empty?
113
-
114
- {
115
- type: 'body',
116
- parameters: build_parameters
117
- }
118
- end
119
-
120
- def build_parameters
121
- case resources
122
- when Hash
123
- named_parameters
124
- when Array
125
- positional_parameters
126
- end
127
- end
128
-
129
- def named_parameters
130
- resources.map do |parameter_name, resource|
131
- resource.build_template_named_parameter(parameter_name.to_s)
132
- end
133
- end
134
-
135
- def positional_parameters
136
- resources.map(&:build_template_positional_parameter)
137
- end
138
-
139
- def add_parameter(parameter_name, instance, &)
140
- case resources
141
- when Hash
142
- resources[parameter_name.to_s] = instance
143
- when Array
144
- resources << instance
145
- else
146
- initialize_resources(parameter_name, instance, &)
147
- end
148
-
149
- block_given? ? instance.tap(&) : instance
150
- end
151
-
152
- def initialize_resources(parameter_name, instance)
153
- if parameter_name.nil?
154
- @resources = []
155
- @resources << instance
156
- else
157
- @resources = {}
158
- @resources[parameter_name] = instance
159
- end
160
- end
161
-
162
- def position
163
- buttons.count
164
- end
165
- end
166
- end
167
- end
data/lib/warb/response.rb DELETED
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Warb
4
- class Response
5
- attr_reader :input, :wa_id, :message_id, :body
6
-
7
- def initialize(body)
8
- @body = body || {}
9
- extract_contact_data
10
- extract_message_data
11
- end
12
-
13
- private
14
-
15
- def extract_contact_data
16
- first_contact = contacts&.first
17
- @input = first_contact&.dig('input')
18
- @wa_id = first_contact&.dig('wa_id')
19
- end
20
-
21
- def extract_message_data
22
- @message_id = messages&.first&.dig('id')
23
- end
24
-
25
- def contacts
26
- @body['contacts']
27
- end
28
-
29
- def messages
30
- @body['messages']
31
- end
32
- end
33
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Warb
4
- class ResponseErrorHandler
5
- def initialize(body, status)
6
- @body = body
7
- @status = status
8
- end
9
-
10
- def handle
11
- raise Warb::RequestError, 'invalid body' if @body.nil?
12
-
13
- http_class = Warb::HTTP_ERRORS[@status]
14
- error_class = custom_class || http_class || Warb::RequestError
15
- Warb.configuration.logger.error(message.to_s)
16
-
17
- raise error_class, message_from_error
18
- end
19
-
20
- private
21
-
22
- def custom_class
23
- Warb.configuration.custom_errors[@status]&.dig(code)
24
- end
25
-
26
- def message_from_error
27
- details || message || "HTTP #{@status}"
28
- end
29
-
30
- def code
31
- @code ||= @body.dig('error', 'code')
32
- end
33
-
34
- def message
35
- @message ||= @body.dig('error', 'message')
36
- end
37
-
38
- def details
39
- @details ||= @body.dig('error', 'error_data', 'details')
40
- end
41
- end
42
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Warb
4
- class TemplateDispatcher < Dispatcher
5
- def list(**args)
6
- filter = args.slice(:limit, :fields, :after, :before)
7
- filter[:fields] = filter[:fields].join(',') if filter[:fields].is_a?(Array)
8
-
9
- @client.get('message_templates', endpoint_prefix: :business_id, data: filter).body
10
- end
11
- end
12
- end