diff --git a/app/models/concerns/smooch_capi.rb b/app/models/concerns/smooch_capi.rb index 291dc03433..2f51ed9a01 100644 --- a/app/models/concerns/smooch_capi.rb +++ b/app/models/concerns/smooch_capi.rb @@ -39,7 +39,9 @@ def capi_api_get_user_data(uid, payload) end def get_capi_uid(value) - "#{value.dig('metadata', 'display_phone_number')}:#{value.dig('contacts', 0, 'wa_id')}" + # Get WhatsApp phone and fallback to WhatsApp BSUID + user_id = value.dig('contacts', 0, 'wa_id') || value.dig('contacts', 0, 'user_id') + "#{value.dig('metadata', 'display_phone_number')}:#{user_id}" end def get_capi_message_text(message) @@ -69,7 +71,8 @@ def store_capi_media(media_id, mime_type) def handle_capi_system_message(message) if message.dig('system', 'type') == 'user_changed_number' old_uid = "#{self.config['capi_phone_number']}:#{message['from']}" - new_uid = "#{self.config['capi_phone_number']}:#{message['system']['wa_id']}" + user_id = message['system']['wa_id'] || message['system']['user_id'] + new_uid = "#{self.config['capi_phone_number']}:#{user_id}" TiplineSubscription.where(uid: old_uid).find_each do |subscription| subscription.uid = new_uid subscription.save! diff --git a/test/models/concerns/smooch_capi_test.rb b/test/models/concerns/smooch_capi_test.rb index 2a9f9d3277..89fc2eb193 100644 --- a/test/models/concerns/smooch_capi_test.rb +++ b/test/models/concerns/smooch_capi_test.rb @@ -164,6 +164,16 @@ def teardown assert_equal 'message:appUser', preprocessed_message[:trigger] end + test 'should preprocess incoming text and fallback to user_id' do + payload = JSON.parse(@incoming_text_message_payload.clone) + payload['entry'][0]['changes'][0]['value']['contacts'][0]['wa_id'] = nil + payload['entry'][0]['changes'][0]['value']['contacts'][0]['user_id'] = 'id:654321' + preprocessed_message = Bot::Smooch.preprocess_message(payload.to_json) + # Verify _id and authId include user_id when wa_id is nil + assert_equal "123456:id:654321", preprocessed_message.dig('appUser', '_id') + assert_equal "123456:id:654321", preprocessed_message.dig('messages', 0, 'authorId') + end + test 'should preprocess message delivery event' do preprocessed_message = Bot::Smooch.preprocess_message(@message_delivery_payload) assert_equal @uid, preprocessed_message.dig('appUser', '_id')