Compare commits

...
Author SHA1 Message Date
copilot-swe-agent[bot] 3d7bb40a11 Initial plan 2025-12-15 08:17:56 +00:00
Muhsin 03e0ee8e7a feat: add conversation workflow be changes 2025-12-15 09:33:22 +05:30
4 changed files with 65 additions and 3 deletions
@@ -92,7 +92,8 @@ class Api::V1::AccountsController < Api::BaseController
end
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
def check_signup_enabled
+6 -2
View File
@@ -37,7 +37,11 @@ class Account < ApplicationRecord
'auto_resolve_message': { 'type': %w[string null] },
'auto_resolve_ignore_waiting': { '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': [],
'additionalProperties': true
@@ -55,7 +59,7 @@ class Account < ApplicationRecord
attribute_resolver: ->(record) { record.settings }
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 :agent_bot_inboxes, dependent: :destroy_async
@@ -45,6 +45,7 @@ class CustomAttributeDefinition < ApplicationRecord
belongs_to :account
after_update :update_widget_pre_chat_custom_fields
after_destroy :sync_widget_pre_chat_custom_fields
after_destroy :cleanup_conversation_required_attributes
private
@@ -56,6 +57,13 @@ class CustomAttributeDefinition < ApplicationRecord
::Inboxes::UpdateWidgetPreChatCustomFieldsJob.perform_later(account, self)
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
model_keys = attribute_model.to_sym == :conversation_attribute ? :conversation : :contact
return unless attribute_key.in?(STANDARD_ATTRIBUTES[model_keys])
@@ -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