* fix: return not_found status for missing messages in WhatsApp webhook * feat: enhance message handling to support image attachments * chore: Handle incoming whatsapp baileys service attachments and implement specs for images and videos * fix: add file_content_type method to incoming baileys messages * chore: specs for stickers, audio and files * fix: handle media attachment errors * chore: convert file_content_type to string when attaching media * fix: add handling for attachment not found error in incoming message service * chore: refactor file_content_type method and simplify filename method * chore: update media attachment tests * feat: baileys unsupported message alert (#27) * feat: create alert message for unsupported message types * chore: fail message when try send not supported type in baileys * chore: add tests for unsupported message handling in Baileys service * chore: correct spelling * chore: NIT in spec name * chore: remove unnecessary message reload in unsupported message type test * feat: baileys support to send attachments (#28) * feat: enhance message sending logic with support for attachments and interactive messages * fix: update message format to use messageContent for text messages * feat: attachment message sending * fix: use strict encoding for attachment file download * chore: streamline message sending logic and remove unused error classes * chore: remove type from message sending logic * chore: update message sending specs * chore: raise MessageNotSentError instead of updating message status to failed * chore: change baileys contact name preferences (#30) * refactor: improve contact name handling and extraction from JID * test: enhance message handling to update contact names based on pushName and verifiedBizName * chore: update contact name condition to match phone number from JID * chore: correct method name typo * chore: correct variable names for phone number consistency in tests * chore: update message payload structure and improve error handling in send_message * test: re-add testing for error handling * feat: enhance contact name handling and add self-message detection * fix: ensure presence check for verified business name in contact name retrieval * test: improve specs --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai> --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai> * fix: try to disconnect baileys before destroy inbox (#29) * fix: ensure proper disconnection of Baileys provider on channel destruction * test: add callback tests for disconnecting channel provider in Whatsapp spec * refactor: simplify condition for disconnecting Baileys provider on channel destruction * refactor: enhance disconnect_channel_provider specs for Baileys provider * test: verify channel destruction does not call disconnect_channel_provider --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> --------- Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com> Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai>
51 lines
1.6 KiB
Ruby
51 lines
1.6 KiB
Ruby
class Webhooks::WhatsappController < ActionController::API
|
|
include MetaTokenVerifyConcern
|
|
|
|
def process_payload
|
|
if inactive_whatsapp_number?
|
|
Rails.logger.warn("Rejected webhook for inactive WhatsApp number: #{params[:phone_number]}")
|
|
render json: { error: 'Inactive WhatsApp number' }, status: :unprocessable_entity
|
|
return
|
|
end
|
|
|
|
perform_whatsapp_events_job
|
|
end
|
|
|
|
private
|
|
|
|
def perform_whatsapp_events_job
|
|
perform_sync if params[:awaitResponse].present?
|
|
return if performed?
|
|
|
|
Webhooks::WhatsappEventsJob.perform_later(params.to_unsafe_hash)
|
|
head :ok
|
|
end
|
|
|
|
def perform_sync
|
|
Webhooks::WhatsappEventsJob.perform_now(params.to_unsafe_hash)
|
|
rescue Whatsapp::IncomingMessageBaileysService::InvalidWebhookVerifyToken
|
|
head :unauthorized
|
|
rescue Whatsapp::IncomingMessageBaileysService::MessageNotFoundError
|
|
head :not_found
|
|
rescue Whatsapp::IncomingMessageBaileysService::AttachmentNotFoundError
|
|
head :unprocessable_entity
|
|
end
|
|
|
|
def valid_token?(token)
|
|
channel = Channel::Whatsapp.find_by(phone_number: params[:phone_number])
|
|
whatsapp_webhook_verify_token = channel.provider_config['webhook_verify_token'] if channel.present?
|
|
token == whatsapp_webhook_verify_token if whatsapp_webhook_verify_token.present?
|
|
end
|
|
|
|
def inactive_whatsapp_number?
|
|
phone_number = params[:phone_number]
|
|
return false if phone_number.blank?
|
|
|
|
inactive_numbers = GlobalConfig.get_value('INACTIVE_WHATSAPP_NUMBERS').to_s
|
|
return false if inactive_numbers.blank?
|
|
|
|
inactive_numbers_array = inactive_numbers.split(',').map(&:strip)
|
|
inactive_numbers_array.include?(phone_number)
|
|
end
|
|
end
|