feat: Conversation workflow backend changes (#13070)
Extracted the backend changes from https://github.com/chatwoot/chatwoot/pull/13040 - Added the support for saving `conversation_required_attributes` in account - Delete `conversation_required_attributes` if custom attribute deleted. Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
This commit is contained in:
@@ -92,7 +92,8 @@ class Api::V1::AccountsController < Api::BaseController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def settings_params
|
def settings_params
|
||||||
params.permit(:auto_resolve_after, :auto_resolve_message, :auto_resolve_ignore_waiting, :audio_transcriptions, :auto_resolve_label)
|
params.permit(:auto_resolve_after, :auto_resolve_message, :auto_resolve_ignore_waiting, :audio_transcriptions, :auto_resolve_label,
|
||||||
|
conversation_required_attributes: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_signup_enabled
|
def check_signup_enabled
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ class Account < ApplicationRecord
|
|||||||
'auto_resolve_message': { 'type': %w[string null] },
|
'auto_resolve_message': { 'type': %w[string null] },
|
||||||
'auto_resolve_ignore_waiting': { 'type': %w[boolean null] },
|
'auto_resolve_ignore_waiting': { 'type': %w[boolean null] },
|
||||||
'audio_transcriptions': { 'type': %w[boolean null] },
|
'audio_transcriptions': { 'type': %w[boolean null] },
|
||||||
'auto_resolve_label': { 'type': %w[string null] }
|
'auto_resolve_label': { 'type': %w[string null] },
|
||||||
|
'conversation_required_attributes': {
|
||||||
|
'type': %w[array null],
|
||||||
|
'items': { 'type': 'string' }
|
||||||
|
}
|
||||||
},
|
},
|
||||||
'required': [],
|
'required': [],
|
||||||
'additionalProperties': true
|
'additionalProperties': true
|
||||||
@@ -55,7 +59,7 @@ class Account < ApplicationRecord
|
|||||||
attribute_resolver: ->(record) { record.settings }
|
attribute_resolver: ->(record) { record.settings }
|
||||||
|
|
||||||
store_accessor :settings, :auto_resolve_after, :auto_resolve_message, :auto_resolve_ignore_waiting
|
store_accessor :settings, :auto_resolve_after, :auto_resolve_message, :auto_resolve_ignore_waiting
|
||||||
store_accessor :settings, :audio_transcriptions, :auto_resolve_label
|
store_accessor :settings, :audio_transcriptions, :auto_resolve_label, :conversation_required_attributes
|
||||||
|
|
||||||
has_many :account_users, dependent: :destroy_async
|
has_many :account_users, dependent: :destroy_async
|
||||||
has_many :agent_bot_inboxes, dependent: :destroy_async
|
has_many :agent_bot_inboxes, dependent: :destroy_async
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class CustomAttributeDefinition < ApplicationRecord
|
|||||||
belongs_to :account
|
belongs_to :account
|
||||||
after_update :update_widget_pre_chat_custom_fields
|
after_update :update_widget_pre_chat_custom_fields
|
||||||
after_destroy :sync_widget_pre_chat_custom_fields
|
after_destroy :sync_widget_pre_chat_custom_fields
|
||||||
|
after_destroy :cleanup_conversation_required_attributes
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
@@ -56,6 +57,13 @@ class CustomAttributeDefinition < ApplicationRecord
|
|||||||
::Inboxes::UpdateWidgetPreChatCustomFieldsJob.perform_later(account, self)
|
::Inboxes::UpdateWidgetPreChatCustomFieldsJob.perform_later(account, self)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cleanup_conversation_required_attributes
|
||||||
|
return unless conversation_attribute? && account.conversation_required_attributes&.include?(attribute_key)
|
||||||
|
|
||||||
|
account.conversation_required_attributes = account.conversation_required_attributes - [attribute_key]
|
||||||
|
account.save!
|
||||||
|
end
|
||||||
|
|
||||||
def attribute_must_not_conflict
|
def attribute_must_not_conflict
|
||||||
model_keys = attribute_model.to_sym == :conversation_attribute ? :conversation : :contact
|
model_keys = attribute_model.to_sym == :conversation_attribute ? :conversation : :contact
|
||||||
return unless attribute_key.in?(STANDARD_ATTRIBUTES[model_keys])
|
return unless attribute_key.in?(STANDARD_ATTRIBUTES[model_keys])
|
||||||
|
|||||||
49
spec/models/custom_attribute_definition_spec.rb
Normal file
49
spec/models/custom_attribute_definition_spec.rb
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe CustomAttributeDefinition do
|
||||||
|
describe 'callbacks' do
|
||||||
|
describe '#cleanup_conversation_required_attributes' do
|
||||||
|
let(:account) { create(:account) }
|
||||||
|
let(:attribute_key) { 'test_attribute' }
|
||||||
|
let!(:custom_attribute) do
|
||||||
|
create(:custom_attribute_definition,
|
||||||
|
account: account,
|
||||||
|
attribute_key: attribute_key,
|
||||||
|
attribute_model: 'conversation_attribute')
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when conversation attribute is in required attributes list' do
|
||||||
|
before do
|
||||||
|
account.update!(conversation_required_attributes: [attribute_key, 'other_attribute'])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'removes the attribute from conversation_required_attributes when destroyed' do
|
||||||
|
expect { custom_attribute.destroy! }
|
||||||
|
.to change { account.reload.conversation_required_attributes }
|
||||||
|
.from([attribute_key, 'other_attribute'])
|
||||||
|
.to(['other_attribute'])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when attribute is contact_attribute' do
|
||||||
|
let!(:contact_attribute) do
|
||||||
|
create(:custom_attribute_definition,
|
||||||
|
account: account,
|
||||||
|
attribute_key: attribute_key,
|
||||||
|
attribute_model: 'contact_attribute')
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
account.update!(conversation_required_attributes: [attribute_key])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not modify conversation_required_attributes when destroyed' do
|
||||||
|
expect { contact_attribute.destroy! }
|
||||||
|
.not_to(change { account.reload.conversation_required_attributes })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user