feat: add automation condition to filter private notes (#12102)

## Summary

Adds a new automation condition to filter private notes.

This allows automation rules to explicitly include or exclude private
notes instead of relying on implicit behavior.

Fixes: #11208 

## Preview



https://github.com/user-attachments/assets/c40f6910-7bbf-4e59-aae5-ad408602927a
This commit is contained in:
Sojan Jose
2026-04-13 10:40:46 +05:30
committed by GitHub
parent de0bd8e71b
commit 45b6ea6b3f
14 changed files with 153 additions and 4 deletions

View File

@@ -220,6 +220,15 @@ describe AutomationRuleListener do
expect(AutomationRules::ActionService).not_to have_received(:new)
end
it 'calls AutomationRules::ActionService if message is a private note' do
message.update!(private: true)
allow(condition_match).to receive(:present?).and_return(true)
listener.message_created(event)
expect(AutomationRules::ActionService).to have_received(:new).with(automation_rule, account, conversation)
end
it 'does not call AutomationRules::ActionService if conditions do not match based on content' do
message.update!(processed_message_content: 'hi', content: "hi\n\nhello")
allow(condition_match).to receive(:present?).and_return(false)

View File

@@ -86,6 +86,19 @@ RSpec.describe AutomationRule do
rule = FactoryBot.build(:automation_rule, params)
expect(rule.valid?).to be true
end
it 'allows private_note as a valid condition attribute' do
params[:conditions] = [
{
attribute_key: 'private_note',
filter_operator: 'equal_to',
values: [true],
query_operator: nil
}
]
rule = FactoryBot.build(:automation_rule, params)
expect(rule.valid?).to be true
end
end
describe 'reauthorizable' do

View File

@@ -10,7 +10,8 @@ RSpec.describe AutomationRules::ConditionValidationService do
rule.conditions = [
{ 'values': ['open'], 'attribute_key': 'status', 'query_operator': nil, 'filter_operator': 'equal_to' },
{ 'values': ['+918484'], 'attribute_key': 'phone_number', 'query_operator': 'OR', 'filter_operator': 'contains' },
{ 'values': ['test'], 'attribute_key': 'email', 'query_operator': nil, 'filter_operator': 'contains' }
{ 'values': ['test'], 'attribute_key': 'email', 'query_operator': 'OR', 'filter_operator': 'contains' },
{ 'values': [true], 'attribute_key': 'private_note', 'query_operator': nil, 'filter_operator': 'equal_to' }
]
rule.save
end

View File

@@ -83,6 +83,27 @@ RSpec.describe AutomationRules::ConditionsFilterService do
end
end
context 'when filtering private notes' do
before do
rule.conditions = [
{ 'values': [true], 'attribute_key': 'private_note', 'query_operator': nil, 'filter_operator': 'equal_to' }
]
rule.save
end
it 'will return true when the message is a private note' do
message.update!(private: true)
expect(described_class.new(rule, conversation, { message: message, changed_attributes: {} }).perform).to be(true)
end
it 'will return false when the message is not a private note' do
message.update!(private: false)
expect(described_class.new(rule, conversation, { message: message, changed_attributes: {} }).perform).to be(false)
end
end
context 'when filter_operator is on processed_message_content' do
before do
rule.conditions = [