107 lines
2.9 KiB
Ruby
107 lines
2.9 KiB
Ruby
#######################################
|
|
# To create a whatsapp provider
|
|
# - Inherit this as the base class.
|
|
# - Implement `send_message` method in your child class.
|
|
# - Implement `send_template_message` method in your child class.
|
|
# - Implement `sync_templates` method in your child class.
|
|
# - Implement `validate_provider_config` method in your child class.
|
|
# - Use Childclass.new(whatsapp_channel: channel).perform.
|
|
######################################
|
|
|
|
class Whatsapp::Providers::BaseService
|
|
pattr_initialize [:whatsapp_channel!]
|
|
|
|
def send_message(_phone_number, _message)
|
|
raise 'Overwrite this method in child class'
|
|
end
|
|
|
|
def send_template(_phone_number, _template_info, _message)
|
|
raise 'Overwrite this method in child class'
|
|
end
|
|
|
|
def sync_template
|
|
raise 'Overwrite this method in child class'
|
|
end
|
|
|
|
def validate_provider_config
|
|
raise 'Overwrite this method in child class'
|
|
end
|
|
|
|
def error_message
|
|
raise 'Overwrite this method in child class'
|
|
end
|
|
|
|
def process_response(response, message)
|
|
parsed_response = response.parsed_response
|
|
if response.success? && parsed_response['error'].blank?
|
|
parsed_response['messages'].first['id']
|
|
else
|
|
handle_error(response, message)
|
|
nil
|
|
end
|
|
end
|
|
|
|
def handle_error(response, message)
|
|
Rails.logger.error response.body
|
|
return if message.blank?
|
|
|
|
# https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes/#sample-response
|
|
error_message = error_message(response)
|
|
return if error_message.blank?
|
|
|
|
message.external_error = error_message
|
|
message.status = :failed
|
|
message.save!
|
|
end
|
|
|
|
def create_buttons(items)
|
|
buttons = []
|
|
items.each do |item|
|
|
button = { :type => 'reply', 'reply' => { 'id' => item['value'], 'title' => item['title'] } }
|
|
buttons << button
|
|
end
|
|
buttons
|
|
end
|
|
|
|
def create_rows(items)
|
|
rows = []
|
|
items.each do |item|
|
|
row = { 'id' => item['value'], 'title' => item['title'] }
|
|
rows << row
|
|
end
|
|
rows
|
|
end
|
|
|
|
def create_payload(type, message_content, action)
|
|
{
|
|
'type': type,
|
|
'body': {
|
|
'text': message_content
|
|
},
|
|
'action': action
|
|
}
|
|
end
|
|
|
|
def create_payload_based_on_items(message)
|
|
if message.content_attributes['items'].length <= 3
|
|
create_button_payload(message)
|
|
else
|
|
create_list_payload(message)
|
|
end
|
|
end
|
|
|
|
def create_button_payload(message)
|
|
buttons = create_buttons(message.content_attributes['items'])
|
|
json_hash = { 'buttons' => buttons }
|
|
create_payload('button', message.outgoing_content, JSON.generate(json_hash))
|
|
end
|
|
|
|
def create_list_payload(message)
|
|
rows = create_rows(message.content_attributes['items'])
|
|
section1 = { 'rows' => rows }
|
|
sections = [section1]
|
|
json_hash = { :button => I18n.t('conversations.messages.whatsapp.list_button_label'), 'sections' => sections }
|
|
create_payload('list', message.outgoing_content, JSON.generate(json_hash))
|
|
end
|
|
end
|