Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled
- Add Logistics component with progress tracking - Add OrderDetail component for order information - Support data-driven steps and actions - Add blue color scale to widget SCSS - Fix node overflow and progress bar rendering issues - Add English translations for dashboard components Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
63 lines
2.1 KiB
Ruby
63 lines
2.1 KiB
Ruby
class ContactMergeAction
|
|
include Events::Types
|
|
pattr_initialize [:account!, :base_contact!, :mergee_contact!]
|
|
|
|
def perform
|
|
# This case happens when an agent updates a contact email in dashboard,
|
|
# while the contact also update his email via email collect box
|
|
return @base_contact if base_contact.id == mergee_contact.id
|
|
|
|
ActiveRecord::Base.transaction do
|
|
validate_contacts
|
|
merge_conversations
|
|
merge_messages
|
|
merge_contact_inboxes
|
|
merge_contact_notes
|
|
merge_and_remove_mergee_contact
|
|
end
|
|
@base_contact
|
|
end
|
|
|
|
private
|
|
|
|
def validate_contacts
|
|
return if belongs_to_account?(@base_contact) && belongs_to_account?(@mergee_contact)
|
|
|
|
raise StandardError, 'contact does not belong to the account'
|
|
end
|
|
|
|
def belongs_to_account?(contact)
|
|
@account.id == contact.account_id
|
|
end
|
|
|
|
def merge_conversations
|
|
Conversation.where(contact_id: @mergee_contact.id).update(contact_id: @base_contact.id)
|
|
end
|
|
|
|
def merge_contact_notes
|
|
Note.where(contact_id: @mergee_contact.id, account_id: @mergee_contact.account_id).update(contact_id: @base_contact.id)
|
|
end
|
|
|
|
def merge_messages
|
|
Message.where(sender: @mergee_contact).update(sender: @base_contact)
|
|
end
|
|
|
|
def merge_contact_inboxes
|
|
ContactInbox.where(contact_id: @mergee_contact.id).update(contact_id: @base_contact.id)
|
|
end
|
|
|
|
def merge_and_remove_mergee_contact
|
|
mergable_attribute_keys = %w[identifier name email phone_number additional_attributes custom_attributes]
|
|
base_contact_attributes = base_contact.attributes.slice(*mergable_attribute_keys).compact_blank
|
|
mergee_contact_attributes = mergee_contact.attributes.slice(*mergable_attribute_keys).compact_blank
|
|
|
|
# attributes in base contact are given preference
|
|
merged_attributes = mergee_contact_attributes.deep_merge(base_contact_attributes)
|
|
|
|
@mergee_contact.reload.destroy!
|
|
Rails.configuration.dispatcher.dispatch(CONTACT_MERGED, Time.zone.now, contact: @base_contact,
|
|
tokens: [@base_contact.contact_inboxes.filter_map(&:pubsub_token)])
|
|
@base_contact.update!(merged_attributes)
|
|
end
|
|
end
|