From 9e052fd5b2f49bf6fb6cb50872b361160c538d57 Mon Sep 17 00:00:00 2001 From: "Aswin Dev P.S" Date: Fri, 13 Aug 2021 17:26:09 +0530 Subject: [PATCH] chore: Set phone_number through Website SDK (#2803) Fixes: #2599 --- app/actions/contact_identify_action.rb | 27 ++++++++++++++++--- .../api/v1/widget/contacts_controller.rb | 2 +- .../widget/store/modules/contacts.js | 1 + app/views/widget_tests/index.html.erb | 3 ++- spec/actions/contact_identify_action_spec.rb | 11 ++++++++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/actions/contact_identify_action.rb b/app/actions/contact_identify_action.rb index 91060f215..655c6bc1c 100644 --- a/app/actions/contact_identify_action.rb +++ b/app/actions/contact_identify_action.rb @@ -3,8 +3,9 @@ class ContactIdentifyAction def perform ActiveRecord::Base.transaction do - @contact = merge_contact(existing_identified_contact, @contact) if merge_contacts?(existing_identified_contact, @contact) - @contact = merge_contact(existing_email_contact, @contact) if merge_contacts?(existing_email_contact, @contact) + merge_if_existing_identified_contact + merge_if_existing_email_contact + merge_if_existing_phone_number_contact update_contact end @contact @@ -16,6 +17,18 @@ class ContactIdentifyAction @account ||= @contact.account end + def merge_if_existing_identified_contact + @contact = merge_contact(existing_identified_contact, @contact) if merge_contacts?(existing_identified_contact, @contact) + end + + def merge_if_existing_email_contact + @contact = merge_contact(existing_email_contact, @contact) if merge_contacts?(existing_email_contact, @contact) + end + + def merge_if_existing_phone_number_contact + @contact = merge_contact(existing_phone_number_contact, @contact) if merge_contacts?(existing_phone_number_contact, @contact) + end + def existing_identified_contact return if params[:identifier].blank? @@ -28,6 +41,12 @@ class ContactIdentifyAction @existing_email_contact ||= Contact.where(account_id: account.id).find_by(email: params[:email]) end + def existing_phone_number_contact + return if params[:phone_number].blank? + + @existing_phone_number_contact ||= Contact.where(account_id: account.id).find_by(phone_number: params[:phone_number]) + end + def merge_contacts?(existing_contact, _contact) existing_contact && existing_contact.id != @contact.id end @@ -36,7 +55,9 @@ class ContactIdentifyAction custom_attributes = params[:custom_attributes] ? @contact.custom_attributes.merge(params[:custom_attributes]) : @contact.custom_attributes # blank identifier or email will throw unique index error # TODO: replace reject { |_k, v| v.blank? } with compact_blank when rails is upgraded - @contact.update!(params.slice(:name, :email, :identifier).reject { |_k, v| v.blank? }.merge({ custom_attributes: custom_attributes })) + @contact.update!(params.slice(:name, :email, :identifier, :phone_number).reject do |_k, v| + v.blank? + end.merge({ custom_attributes: custom_attributes })) ContactAvatarJob.perform_later(@contact, params[:avatar_url]) if params[:avatar_url].present? end diff --git a/app/controllers/api/v1/widget/contacts_controller.rb b/app/controllers/api/v1/widget/contacts_controller.rb index 135d2ced3..8bc5cfd0b 100644 --- a/app/controllers/api/v1/widget/contacts_controller.rb +++ b/app/controllers/api/v1/widget/contacts_controller.rb @@ -29,6 +29,6 @@ class Api::V1::Widget::ContactsController < Api::V1::Widget::BaseController end def permitted_params - params.permit(:website_token, :identifier, :identifier_hash, :email, :name, :avatar_url, custom_attributes: {}) + params.permit(:website_token, :identifier, :identifier_hash, :email, :name, :avatar_url, :phone_number, custom_attributes: {}) end end diff --git a/app/javascript/widget/store/modules/contacts.js b/app/javascript/widget/store/modules/contacts.js index 582b78414..f1ef555e5 100644 --- a/app/javascript/widget/store/modules/contacts.js +++ b/app/javascript/widget/store/modules/contacts.js @@ -29,6 +29,7 @@ export const actions = { name: userObject.name, avatar_url: userObject.avatar_url, identifier_hash: userObject.identifier_hash, + phone_number: userObject.phone_number, }; const { data: { pubsub_token: pubsubToken }, diff --git a/app/views/widget_tests/index.html.erb b/app/views/widget_tests/index.html.erb index 7d76512d6..78dbaa37c 100644 --- a/app/views/widget_tests/index.html.erb +++ b/app/views/widget_tests/index.html.erb @@ -39,7 +39,8 @@ window.addEventListener('chatwoot:ready', function() { window.$chatwoot.setUser('<%= user_id %>', { identifier_hash: '<%= user_hash %>', email: 'jane@example.com', - name: 'Jane Doe' + name: 'Jane Doe', + phone_number: '' }); } }) diff --git a/spec/actions/contact_identify_action_spec.rb b/spec/actions/contact_identify_action_spec.rb index be139a22e..c18284c5d 100644 --- a/spec/actions/contact_identify_action_spec.rb +++ b/spec/actions/contact_identify_action_spec.rb @@ -45,6 +45,17 @@ describe ::ContactIdentifyAction do end end + context 'when contact with same phone_number exists' do + it 'merges the current contact to phone_number contact' do + existing_phone_number_contact = create(:contact, account: account, phone_number: '+919999888877') + params = { phone_number: '+919999888877' } + result = described_class.new(contact: contact, params: params).perform + expect(result.id).to eq existing_phone_number_contact.id + expect(result.name).to eq existing_phone_number_contact.name + expect { contact.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + end + context 'when contacts with blank identifiers exist and identify action is called with blank identifier' do it 'updates the attributes of contact passed in to identify action' do create(:contact, account: account, identifier: '')