feat(wa-cloud): reaction messages and meta is_record_audio for voice messages (#111)
* feat: add send_reaction_message method and corresponding tests * chore: useless comment from previous PR * feat(wa-cloud): set is_recorded_audio for voice message
This commit is contained in:
parent
3dac94e058
commit
6cd0a3bf7f
@ -126,7 +126,8 @@ class Whatsapp::IncomingMessageBaseService
|
|||||||
io: attachment_file,
|
io: attachment_file,
|
||||||
filename: attachment_file.original_filename,
|
filename: attachment_file.original_filename,
|
||||||
content_type: attachment_file.content_type
|
content_type: attachment_file.content_type
|
||||||
}
|
},
|
||||||
|
meta: ({ is_recorded_audio: true } if attachment_payload[:voice])
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseService
|
class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseService # rubocop:disable Metrics/ClassLength
|
||||||
def send_message(phone_number, message)
|
def send_message(phone_number, message)
|
||||||
@message = message
|
@message = message
|
||||||
|
|
||||||
@ -6,6 +6,8 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
|
|||||||
send_attachment_message(phone_number, message)
|
send_attachment_message(phone_number, message)
|
||||||
elsif message.content_type == 'input_select'
|
elsif message.content_type == 'input_select'
|
||||||
send_interactive_text_message(phone_number, message)
|
send_interactive_text_message(phone_number, message)
|
||||||
|
elsif message.content_attributes[:is_reaction]
|
||||||
|
send_reaction_message(phone_number, message)
|
||||||
else
|
else
|
||||||
send_text_message(phone_number, message)
|
send_text_message(phone_number, message)
|
||||||
end
|
end
|
||||||
@ -219,4 +221,23 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
|
|||||||
|
|
||||||
response.success?
|
response.success?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def send_reaction_message(phone_number, message)
|
||||||
|
response = HTTParty.post(
|
||||||
|
"#{phone_id_path('v23.0')}/messages",
|
||||||
|
headers: api_headers,
|
||||||
|
body: {
|
||||||
|
messaging_product: 'whatsapp',
|
||||||
|
recipient_type: 'individual',
|
||||||
|
to: phone_number,
|
||||||
|
type: 'reaction',
|
||||||
|
reaction: {
|
||||||
|
message_id: message.content_attributes[:in_reply_to_external_id],
|
||||||
|
emoji: message.outgoing_content
|
||||||
|
}
|
||||||
|
}.to_json
|
||||||
|
)
|
||||||
|
|
||||||
|
process_response(response, message)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -18,7 +18,6 @@ RSpec.describe Article do
|
|||||||
it { is_expected.to belong_to(:author) }
|
it { is_expected.to belong_to(:author) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# This validation happens in ApplicationRecord
|
|
||||||
describe 'length validations' do
|
describe 'length validations' do
|
||||||
let(:article) do
|
let(:article) do
|
||||||
create(:article, category_id: category_1.id, content: 'This is the content', description: 'this is the description',
|
create(:article, category_id: category_1.id, content: 'This is the content', description: 'this is the description',
|
||||||
|
|||||||
@ -223,6 +223,28 @@ describe Whatsapp::IncomingMessageService do
|
|||||||
expect(whatsapp_channel.inbox.messages.first.content).to eq('Check out my product!')
|
expect(whatsapp_channel.inbox.messages.first.content).to eq('Check out my product!')
|
||||||
expect(whatsapp_channel.inbox.messages.first.attachments.present?).to be true
|
expect(whatsapp_channel.inbox.messages.first.attachments.present?).to be true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'sets is_recorded_audio metadata for voice messages' do
|
||||||
|
stub_request(:get, whatsapp_channel.media_url('b1c68f38-8734-4ad3-b4a1-ef0c10d683')).to_return(
|
||||||
|
status: 200,
|
||||||
|
body: File.read('spec/assets/sample.mp3'),
|
||||||
|
headers: {}
|
||||||
|
)
|
||||||
|
params = {
|
||||||
|
'contacts' => [{ 'profile' => { 'name' => 'Sojan Jose' }, 'wa_id' => '2423423243' }],
|
||||||
|
'messages' => [{ 'from' => '2423423243', 'id' => 'SDFADSf23sfasdafasdfa',
|
||||||
|
'audio' => { 'id' => 'b1c68f38-8734-4ad3-b4a1-ef0c10d683',
|
||||||
|
'mime_type' => 'audio/mp3',
|
||||||
|
'sha256' => 'fa2820256f2cd3f2df03fa247d7b01e79d3fe794344aadcea08cee06bcce3c94',
|
||||||
|
'voice' => true },
|
||||||
|
'timestamp' => '1633034394', 'type' => 'audio' }]
|
||||||
|
}.with_indifferent_access
|
||||||
|
|
||||||
|
described_class.new(inbox: whatsapp_channel.inbox, params: params).perform
|
||||||
|
|
||||||
|
expect(whatsapp_channel.inbox.conversations.count).not_to eq(0)
|
||||||
|
expect(whatsapp_channel.inbox.messages.first.attachments.first.meta['is_recorded_audio']).to be true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when valid location message params' do
|
context 'when valid location message params' do
|
||||||
|
|||||||
@ -402,4 +402,28 @@ describe Whatsapp::Providers::WhatsappCloudService do
|
|||||||
expect(Rails.logger).to have_received(:error)
|
expect(Rails.logger).to have_received(:error)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#send_reaction_message' do
|
||||||
|
it 'calls messages endpoint to send reaction message' do
|
||||||
|
message_with_reaction = create(:message, message_type: :outgoing, content: '👍', conversation: conversation,
|
||||||
|
inbox: whatsapp_channel.inbox, content_attributes: { is_reaction: true, in_reply_to: message.id })
|
||||||
|
|
||||||
|
stub_request(:post, 'https://graph.facebook.com/v23.0/123456789/messages')
|
||||||
|
.with(
|
||||||
|
body: {
|
||||||
|
messaging_product: 'whatsapp',
|
||||||
|
recipient_type: 'individual',
|
||||||
|
to: '+123456789',
|
||||||
|
type: 'reaction',
|
||||||
|
reaction: {
|
||||||
|
message_id: message.source_id,
|
||||||
|
emoji: '👍'
|
||||||
|
}
|
||||||
|
}.to_json
|
||||||
|
)
|
||||||
|
.to_return(status: 200, body: whatsapp_response.to_json, headers: response_headers)
|
||||||
|
|
||||||
|
expect(service.send_message('+123456789', message_with_reaction)).to eq 'message_id'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user