diff --git a/app/models/channel/whatsapp.rb b/app/models/channel/whatsapp.rb index 7a109c455..87ff199d5 100644 --- a/app/models/channel/whatsapp.rb +++ b/app/models/channel/whatsapp.rb @@ -101,6 +101,13 @@ class Channel::Whatsapp < ApplicationRecord end end + # Whether the pending (unsaved) provider_config change drops the embedded_signup + # source marker, i.e. this save is an embedded signup → manual setup transfer. + def embedded_to_manual_transfer_pending? + before, after = provider_config_change + before&.dig('source') == 'embedded_signup' && after['source'] != 'embedded_signup' + end + def mark_message_templates_updated # rubocop:disable Rails/SkipsModelValidations update_column(:message_templates_last_updated, Time.zone.now) @@ -130,13 +137,14 @@ class Channel::Whatsapp < ApplicationRecord errors.add(:provider_config, 'Invalid Credentials') unless provider_service.validate_provider_config? end - # Logs only credential changes, so config-only saves (e.g. calling toggles) stay silent. + # Logs only the embedded signup → manual migration (the save drops the + # embedded_signup source marker), so credential rotations on inboxes that are + # already manual stay silent. def log_credentials_transfer before, after = saved_change_to_provider_config - keys = %w[api_key phone_number_id business_account_id] - return if before.nil? || before.values_at(*keys) == after.values_at(*keys) + return unless before&.dig('source') == 'embedded_signup' && after['source'] != 'embedded_signup' - Rails.logger.info("[WHATSAPP_MANUAL_TRANSFER] success account_id=#{account_id} channel_id=#{id}") + Rails.logger.info("[WHATSAPP_EMBEDDED_TO_MANUAL] success account_id=#{account_id} channel_id=#{id}") end def perform_webhook_setup diff --git a/app/services/whatsapp/providers/whatsapp_cloud_service.rb b/app/services/whatsapp/providers/whatsapp_cloud_service.rb index 373e47b3c..d65c6cc62 100644 --- a/app/services/whatsapp/providers/whatsapp_cloud_service.rb +++ b/app/services/whatsapp/providers/whatsapp_cloud_service.rb @@ -94,12 +94,12 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi private - # Only credential updates on existing channels are transfer attempts; creation failures are regular setup errors. Returns false. + # Only saves dropping the embedded_signup source marker are transfer attempts; creation/rotation failures are setup errors. Returns false. def log_transfer_failure(check, response) - return false unless whatsapp_channel.persisted? && whatsapp_channel.provider_config_changed? + return false unless whatsapp_channel.embedded_to_manual_transfer_pending? error_message = response.parsed_response.is_a?(Hash) ? response.parsed_response.dig('error', 'message') : nil - Rails.logger.warn("[WHATSAPP_MANUAL_TRANSFER] failure account_id=#{whatsapp_channel.account_id} channel_id=#{whatsapp_channel.id} " \ + Rails.logger.warn("[WHATSAPP_EMBEDDED_TO_MANUAL] failure account_id=#{whatsapp_channel.account_id} channel_id=#{whatsapp_channel.id} " \ "check=#{check} http_status=#{response.code} meta_error=#{error_message}") false end