diff --git a/.rubocop.yml b/.rubocop.yml index e9964b1c0..34d5b0bda 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -11,6 +11,7 @@ Metrics/ClassLength: Max: 125 Exclude: - 'app/models/conversation.rb' + - 'app/models/contact.rb' - 'app/mailers/conversation_reply_mailer.rb' - 'app/models/message.rb' - 'app/builders/messages/facebook/message_builder.rb' diff --git a/app/models/contact.rb b/app/models/contact.rb index 7b257bab4..ebddb6828 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -45,7 +45,7 @@ class Contact < ApplicationRecord has_many :messages, as: :sender, dependent: :destroy_async has_many :notes, dependent: :destroy_async - before_validation :prepare_email_attribute + before_validation :prepare_contact_attributes after_create_commit :dispatch_create_event, :ip_lookup after_update_commit :dispatch_update_event after_destroy_commit :dispatch_destroy_event @@ -146,10 +146,19 @@ class Contact < ApplicationRecord ContactIpLookupJob.perform_later(self) end + def prepare_contact_attributes + prepare_email_attribute + prepare_jsonb_attributes + end + def prepare_email_attribute # So that the db unique constraint won't throw error when email is '' - self.email = nil if email.blank? - email.downcase! if email.present? + self.email = email.present? ? email.downcase : nil + end + + def prepare_jsonb_attributes + self.additional_attributes = {} if additional_attributes.blank? + self.custom_attributes = {} if custom_attributes.blank? end def dispatch_create_event diff --git a/db/migrate/20220111200105_update_nil_contact_attributes_to_empty_hash.rb b/db/migrate/20220111200105_update_nil_contact_attributes_to_empty_hash.rb new file mode 100644 index 000000000..31881fe1d --- /dev/null +++ b/db/migrate/20220111200105_update_nil_contact_attributes_to_empty_hash.rb @@ -0,0 +1,8 @@ +class UpdateNilContactAttributesToEmptyHash < ActiveRecord::Migration[6.1] + def change + # rubocop:disable Rails/SkipsModelValidations + Contact.where(custom_attributes: nil).update_all(custom_attributes: {}) + Contact.where(additional_attributes: nil).update_all(additional_attributes: {}) + # rubocop:enable Rails/SkipsModelValidations + end +end diff --git a/db/schema.rb b/db/schema.rb index ad5bc66b0..34bcdce36 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_12_21_125545) do +ActiveRecord::Schema.define(version: 2022_01_11_200105) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -461,7 +461,7 @@ ActiveRecord::Schema.define(version: 2021_12_21_125545) do t.string "timezone", default: "UTC" t.boolean "enable_email_collect", default: true t.boolean "csat_survey_enabled", default: false - t.boolean 'allow_messages_after_resolved', default: true + t.boolean "allow_messages_after_resolved", default: true t.index ["account_id"], name: "index_inboxes_on_account_id" end @@ -830,4 +830,4 @@ ActiveRecord::Schema.define(version: 2021_12_21_125545) do "NEW.display_id := nextval('camp_dpid_seq_' || NEW.account_id);" end -end \ No newline at end of file +end diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index 4306e9e44..f8b701a3a 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -11,4 +11,36 @@ RSpec.describe Contact do it { is_expected.to belong_to(:account) } it { is_expected.to have_many(:conversations).dependent(:destroy_async) } end + + context 'pepare contact attributes before validation' do + it 'sets email to lowercase' do + contact = create(:contact, email: 'Test@test.com') + expect(contact.email).to eq('test@test.com') + end + + it 'sets email to nil when empty string' do + contact = create(:contact, email: '') + expect(contact.email).to be_nil + end + + it 'sets custom_attributes to {} when nil' do + contact = create(:contact, custom_attributes: nil) + expect(contact.custom_attributes).to eq({}) + end + + it 'sets custom_attributes to {} when empty string' do + contact = create(:contact, custom_attributes: '') + expect(contact.custom_attributes).to eq({}) + end + + it 'sets additional_attributes to {} when nil' do + contact = create(:contact, additional_attributes: nil) + expect(contact.additional_attributes).to eq({}) + end + + it 'sets additional_attributes to {} when empty string' do + contact = create(:contact, additional_attributes: '') + expect(contact.additional_attributes).to eq({}) + end + end end