fix: whatsapp cloud to consider multiple attachments

This commit is contained in:
Tejaswini Chile 2022-12-22 18:43:49 +05:30
parent a356c824d0
commit 4988d9e99f
2 changed files with 27 additions and 24 deletions

View file

@ -1,10 +1,10 @@
class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseService class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseService
ATTACHMENT_TYPE = [image, audio, video].freeze ATTACHMENT_TYPES = %w[image audio video].freeze
MESSAGE_CONTENT = [audio, sticker].freeze MESSAGE_CONTENT = %w[audio sticker].freeze
def send_message(phone_number, message) def send_message(phone_number, message)
if message.attachments.present? if message.attachments.present?
send_attachment_message(phone_number, message) process_attachments(phone_number, message)
else else
send_text_message(phone_number, message) send_text_message(phone_number, message)
end end
@ -69,27 +69,30 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
process_response(response) process_response(response)
end end
def send_attachment_message(phone_number, message) def process_attachments(phone_number, message)
responses = []
message.attachments.each do |attachment| message.attachments.each do |attachment|
type = ATTACHMENT_TYPE.include?(attachment.file_type) ? attachment.file_type : 'document' responses << send_attachment_message(phone_number, message, attachment)
type_content = {
'link': attachment.download_url
}
type_content['caption'] = message.content unless MESSAGE_CONTENT.include?(type)
type_content['filename'] = attachment.file.filename if type == 'document'
response = HTTParty.post(
"#{phone_id_path}/messages",
headers: api_headers,
body: {
messaging_product: 'whatsapp',
'to' => phone_number,
'type' => type,
type.to_s => type_content
}.to_json
)
process_response(response)
end end
responses
end
def send_attachment_message(phone_number, message, attachment)
type = self.class::ATTACHMENT_TYPES.include?(attachment.file_type) ? attachment.file_type : 'document'
type_content = { 'link': attachment.download_url }
type_content['caption'] = message.content unless self.class::MESSAGE_CONTENT.include?(type)
type_content['filename'] = attachment.file.filename if type == 'document'
response = HTTParty.post("#{phone_id_path}/messages",
headers: api_headers,
body: {
messaging_product: 'whatsapp',
'to' => phone_number,
'type' => type,
type.to_s => type_content
}.to_json)
process_response(response)
end end
def process_response(response) def process_response(response)

View file

@ -42,7 +42,7 @@ describe Whatsapp::Providers::WhatsappCloudService do
}) })
) )
.to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers) .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers)
expect(service.send_message('+123456789', message)).to eq 'message_id' expect(service.send_message('+123456789', message)).to eq ['message_id']
end end
it 'calls message endpoints for document attachment message messages' do it 'calls message endpoints for document attachment message messages' do
@ -61,7 +61,7 @@ describe Whatsapp::Providers::WhatsappCloudService do
}) })
) )
.to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers) .to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers)
expect(service.send_message('+123456789', message)).to eq 'message_id' expect(service.send_message('+123456789', message)).to eq ['message_id']
end end
end end
end end