fix: undefined method contact in support mailbox (#2678)

if chatwoot receives an email of already existing contact with a different case say "Care@example.com", before this fix, it will throw an error. Now it will retrieve existing contact

Fixes: #2553


Co-authored-by: Sojan Jose <sojan@pepalo.com>
This commit is contained in:
HariniKrishnan 2021-08-12 01:28:07 +05:30 committed by GitHub
parent 4907489ea8
commit a065165bcb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 47 additions and 10 deletions

View file

@ -38,17 +38,30 @@ class ContactBuilder
end
def find_contact
contact = nil
contact = account.contacts.find_by(identifier: contact_attributes[:identifier]) if contact_attributes[:identifier].present?
contact ||= account.contacts.find_by(email: contact_attributes[:email]) if contact_attributes[:email].present?
contact ||= account.contacts.find_by(phone_number: contact_attributes[:phone_number]) if contact_attributes[:phone_number].present?
contact = find_contact_by_identifier(contact_attributes[:identifier])
contact ||= find_contact_by_email(contact_attributes[:email])
contact ||= find_contact_by_phone_number(contact_attributes[:phone_number])
contact
end
def find_contact_by_identifier(identifier)
return if identifier.blank?
account.contacts.find_by(identifier: identifier)
end
def find_contact_by_email(email)
return if email.blank?
account.contacts.find_by(email: email.downcase)
end
def find_contact_by_phone_number(phone_number)
return if phone_number.blank?
account.contacts.find_by(phone_number: phone_number)
end
def build_contact_inbox
ActiveRecord::Base.transaction do
contact = find_contact || create_contact
@ -57,6 +70,7 @@ class ContactBuilder
contact_inbox
rescue StandardError => e
Rails.logger.info e
raise e
end
end
end

View file

@ -77,6 +77,11 @@ class MailPresenter < SimpleDelegator
}
end
def from
# changing to downcase to avoid case mismatch while finding contact
@mail.from.map(&:downcase)
end
private
# forcing the encoding of the content to UTF-8 so as to be compatible with database and serializers

View file

@ -66,6 +66,20 @@ describe ::ContactBuilder do
expect(contact_inbox.contact.id).to be(contact.id)
end
it 'doesnot create contact when an uppercase email is passed for an already existing contact email' do
contact_inbox = described_class.new(
source_id: '123456',
inbox: inbox,
contact_attributes: {
name: 'Contact',
phone_number: '+1234567890',
email: contact.email.upcase
}
).perform
expect(contact_inbox.contact.id).to be(contact.id)
end
it 'doesnot create contact if it already exist with phone number' do
contact_inbox = described_class.new(
source_id: '123456',

View file

@ -1,4 +1,4 @@
From: Sony Mathew <sony@chatwoot.com>
From: Sony Mathew <Sony@chatwoot.com>
Mime-Version: 1.0 (Apple Message framework v1244.3)
Content-Type: multipart/alternative; boundary="Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74"
Subject: Discussion: Let's debate these attachments
@ -628,4 +628,4 @@ r/Fxp3Y0d2/4tvsR95f/AAH7Gvwmn9rUHsOgUCg//9k=
--Apple-Mail=_83444AF4-343C-4F75-AF8F-14E1E7434FC1--
--Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74--
--Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74--

View file

@ -52,5 +52,9 @@ RSpec.describe MailPresenter do
expect(data[:multipart]).to eq(true)
expect(data[:subject]).to eq(decorated_mail.subject)
end
it 'give email from in downcased format' do
expect(decorated_mail.from.first.eql?(mail.from.first.downcase)).to eq true
end
end
end