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.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -12
- data/README.md +9 -32
- data/Rakefile +3 -3
- data/docs/README.md +1 -4
- data/docs/components/README.md +1 -4
- data/docs/messages/README.md +1 -2
- data/docs/messages/interactive_call_to_action_url.md +9 -9
- data/docs/messages/interactive_list.md +2 -2
- data/docs/messages/interactive_reply_button.md +9 -9
- data/examples/audio.rb +10 -10
- data/examples/document.rb +34 -34
- data/examples/image.rb +22 -22
- data/examples/interactive_call_to_action_url.rb +46 -46
- data/examples/interactive_list.rb +61 -61
- data/examples/interactive_reply_button.rb +43 -43
- data/examples/location.rb +32 -32
- data/examples/location_request.rb +11 -11
- data/examples/message.rb +8 -8
- data/examples/sticker.rb +10 -10
- data/examples/video.rb +22 -22
- data/examples/webhook.rb +42 -44
- data/lib/warb/client.rb +5 -7
- data/lib/warb/components/action.rb +8 -12
- data/lib/warb/configuration.rb +1 -4
- data/lib/warb/connection.rb +9 -15
- data/lib/warb/dispatcher.rb +3 -4
- data/lib/warb/dispatcher_concern.rb +0 -6
- data/lib/warb/indicator_dispatcher.rb +4 -4
- data/lib/warb/media_dispatcher.rb +10 -10
- data/lib/warb/resources/audio.rb +1 -1
- data/lib/warb/resources/contact.rb +20 -22
- data/lib/warb/resources/document.rb +1 -1
- data/lib/warb/resources/flow.rb +8 -10
- data/lib/warb/resources/image.rb +1 -1
- data/lib/warb/resources/interactive_call_to_action_url.rb +8 -10
- data/lib/warb/resources/interactive_list.rb +5 -7
- data/lib/warb/resources/interactive_reply_button.rb +8 -10
- data/lib/warb/resources/location.rb +1 -11
- data/lib/warb/resources/location_request.rb +3 -5
- data/lib/warb/resources/reaction.rb +1 -1
- data/lib/warb/resources/resource.rb +4 -12
- data/lib/warb/resources/sticker.rb +1 -1
- data/lib/warb/resources/text.rb +3 -21
- data/lib/warb/resources/video.rb +1 -1
- data/lib/warb/utils.rb +1 -3
- data/lib/warb/version.rb +1 -1
- data/lib/warb.rb +31 -50
- metadata +3 -29
- data/docs/components/button.md +0 -61
- data/docs/components/copy_code_button.md +0 -57
- data/docs/components/url_button.md +0 -57
- data/docs/messages/template.md +0 -327
- data/docs/resources/currency.md +0 -22
- data/docs/resources/date_time.md +0 -11
- data/docs/resources/index.md +0 -14
- data/docs/resources/text.md +0 -9
- data/lib/warb/components/button.rb +0 -29
- data/lib/warb/components/component.rb +0 -19
- data/lib/warb/components/copy_code_button.rb +0 -30
- data/lib/warb/components/quick_reply_button.rb +0 -15
- data/lib/warb/components/url_button.rb +0 -30
- data/lib/warb/components/voice_call_button.rb +0 -15
- data/lib/warb/errors.rb +0 -27
- data/lib/warb/language.rb +0 -8
- data/lib/warb/resources/currency.rb +0 -47
- data/lib/warb/resources/date_time.rb +0 -34
- data/lib/warb/resources/template.rb +0 -167
- data/lib/warb/response.rb +0 -33
- data/lib/warb/response_error_handler.rb +0 -42
- 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
|