diff --git a/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb b/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb index 164c3ac12..1fb923917 100644 --- a/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb +++ b/app/services/whatsapp/incoming_message_whatsapp_cloud_service.rb @@ -2,8 +2,23 @@ # https://developers.facebook.com/docs/whatsapp/api/media/ class Whatsapp::IncomingMessageWhatsappCloudService < Whatsapp::IncomingMessageBaseService + include Events::Types + + def perform + return if processed_params.blank? + + Rails.configuration.dispatcher.dispatch(PROVIDER_EVENT_RECEIVED, Time.zone.now, inbox: inbox, event: whatsapp_cloud_event_type, + payload: processed_params) + + super + end + private + def whatsapp_cloud_event_type + params.dig(:entry, 0, :changes, 0, :field) || 'unknown' + end + def processed_params @processed_params ||= params[:entry].try(:first).try(:[], 'changes').try(:first).try(:[], 'value') end diff --git a/spec/services/whatsapp/incoming_message_whatsapp_cloud_service_spec.rb b/spec/services/whatsapp/incoming_message_whatsapp_cloud_service_spec.rb index 4b6841811..4ad948bf3 100644 --- a/spec/services/whatsapp/incoming_message_whatsapp_cloud_service_spec.rb +++ b/spec/services/whatsapp/incoming_message_whatsapp_cloud_service_spec.rb @@ -107,6 +107,53 @@ describe Whatsapp::IncomingMessageWhatsappCloudService do end end + context 'when dispatching provider events' do + let(:message_params) do + { + phone_number: whatsapp_channel.phone_number, + object: 'whatsapp_business_account', + entry: [{ + changes: [{ + field: 'messages', + value: { + contacts: [{ profile: { name: 'Sojan Jose' }, wa_id: '2423423243' }], + messages: [{ + from: '2423423243', + text: { body: 'Hello' }, + timestamp: '1664799904', type: 'text' + }] + } + }] + }] + }.with_indifferent_access + end + + before do + allow(Rails.configuration.dispatcher).to receive(:dispatch) + end + + it 'dispatches provider_event_received with the webhook field as event type' do + described_class.new(inbox: whatsapp_channel.inbox, params: message_params).perform + + expect(Rails.configuration.dispatcher).to have_received(:dispatch).with( + 'provider.event_received', + anything, + hash_including( + inbox: whatsapp_channel.inbox, + event: 'messages', + payload: message_params[:entry][0][:changes][0][:value] + ) + ) + end + + it 'does not dispatch when processed_params is blank' do + empty_params = { phone_number: whatsapp_channel.phone_number, object: 'whatsapp_business_account', entry: {} }.with_indifferent_access + described_class.new(inbox: whatsapp_channel.inbox, params: empty_params).perform + + expect(Rails.configuration.dispatcher).not_to have_received(:dispatch).with('provider.event_received', anything, anything) + end + end + context 'when message is a reply (has context)' do let(:reply_params) do {