Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled
- Add Logistics component with progress tracking - Add OrderDetail component for order information - Support data-driven steps and actions - Add blue color scale to widget SCSS - Fix node overflow and progress bar rendering issues - Add English translations for dashboard components Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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
|