mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-29 02:02:27 +00:00
chore: Prevent null in Contact JSONB attributes (#3730)
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
end
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user