* feat: add message update processing in IncomingMessageBaileysService * feat: implement message update handling in IncomingMessageBaileysService * feat: add MessageNotFoundError for handling invalid update messages in IncomingMessageBaileysService * chore: specs for message.update events and bug fixes * chore: refactor message update handling in IncomingMessageBaileysService * chore: nit remove redundant comment * chore: enhance logging for unsupported message update statuses in IncomingMessageBaileysService and disabled metrics * chore: message status update logic with transition checks * chore: update status mapping for PENDING to sent in status_mapper * chore: update status_mapper comments and fix case statement for status codes * fix: logging for unsupported message updates in update_message_content method * test: add specs for unsupported status transitions in messages.update event * refactor: ensure message status is reloaded before assertion in messages.update event spec * refactor: status variable in status_mapper method * refactor: rename status_transition_allowed method to status_transition_allowed? * refactor: streamline message creation in specs by using let! for setup * feat: process webhook whatsapp await response (#21) * feat: enhance WhatsApp webhook processing and error responses handling * chore: correct spelling of 'WhatsApp' in webhook controller specs * refactor: rename webhook processing method and improve error handling * chore: update error handling in WhatsApp controller specs for specific exceptions * refactor: remove handling for StandardError in WhatsApp controller specs * refactor: simplify perform_whatsapp_events_job method * chore: update response status from not_found to bad_request for invalid message * refactor: update expectations for job processing in WhatsApp controller specs
49 lines
1.5 KiB
Ruby
49 lines
1.5 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 :bad_request
|
|
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
|