feat: Add support for conversation attribute automation conditions in message event (#4518)
Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
This commit is contained in:
@@ -56,7 +56,7 @@ class AutomationRules::ActionService
|
||||
end
|
||||
|
||||
def send_message(message)
|
||||
params = { content: message[0], private: false }
|
||||
params = { content: message[0], private: false, content_attributes: { automation_rule_id: @rule.id } }
|
||||
mb = Messages::MessageBuilder.new(nil, @conversation, params)
|
||||
mb.perform
|
||||
end
|
||||
|
||||
@@ -14,36 +14,33 @@ class AutomationRules::ConditionsFilterService < FilterService
|
||||
end
|
||||
|
||||
def perform
|
||||
conversation_filters = @filters['conversations']
|
||||
contact_filters = @filters['contacts']
|
||||
@conversation_filters = @filters['conversations']
|
||||
@contact_filters = @filters['contacts']
|
||||
@message_filters = @filters['messages']
|
||||
|
||||
@rule.conditions.each_with_index do |query_hash, current_index|
|
||||
conversation_filter = conversation_filters[query_hash['attribute_key']]
|
||||
contact_filter = contact_filters[query_hash['attribute_key']]
|
||||
|
||||
if conversation_filter
|
||||
@query_string += conversation_query_string('conversations', conversation_filter, query_hash.with_indifferent_access, current_index)
|
||||
elsif contact_filter
|
||||
@query_string += conversation_query_string('contacts', contact_filter, query_hash.with_indifferent_access, current_index)
|
||||
elsif custom_attribute(query_hash['attribute_key'], @account)
|
||||
# send table name according to attribute key right now we are supporting contact based custom attribute filter
|
||||
@query_string += custom_attribute_query(query_hash.with_indifferent_access, 'contacts', current_index)
|
||||
end
|
||||
apply_filter(query_hash, current_index)
|
||||
end
|
||||
|
||||
records = base_relation.where(@query_string, @filter_values.with_indifferent_access)
|
||||
records.any?
|
||||
end
|
||||
|
||||
def message_conditions
|
||||
message_filters = @filters['messages']
|
||||
def apply_filter(query_hash, current_index)
|
||||
conversation_filter = @conversation_filters[query_hash['attribute_key']]
|
||||
contact_filter = @contact_filters[query_hash['attribute_key']]
|
||||
message_filter = @message_filters[query_hash['attribute_key']]
|
||||
|
||||
@rule.conditions.each_with_index do |query_hash, current_index|
|
||||
current_filter = message_filters[query_hash['attribute_key']]
|
||||
@query_string += message_query_string(current_filter, query_hash.with_indifferent_access, current_index)
|
||||
if conversation_filter
|
||||
@query_string += conversation_query_string('conversations', conversation_filter, query_hash.with_indifferent_access, current_index)
|
||||
elsif contact_filter
|
||||
@query_string += contact_query_string(contact_filter, query_hash.with_indifferent_access, current_index)
|
||||
elsif message_filter
|
||||
@query_string += message_query_string(message_filter, query_hash.with_indifferent_access, current_index)
|
||||
elsif custom_attribute(query_hash['attribute_key'], @account)
|
||||
# send table name according to attribute key right now we are supporting contact based custom attribute filter
|
||||
@query_string += custom_attribute_query(query_hash.with_indifferent_access, 'contacts', current_index)
|
||||
end
|
||||
records = Message.where(id: @options[:message].id).where(@query_string, @filter_values.with_indifferent_access)
|
||||
records.any?
|
||||
end
|
||||
|
||||
def message_query_string(current_filter, query_hash, current_index)
|
||||
@@ -59,16 +56,18 @@ class AutomationRules::ConditionsFilterService < FilterService
|
||||
end
|
||||
|
||||
# This will be used in future for contact automation rule
|
||||
def contact_conditions(_contact)
|
||||
conversation_filters = @filters['conversations']
|
||||
def contact_query_string(current_filter, query_hash, current_index)
|
||||
attribute_key = query_hash['attribute_key']
|
||||
query_operator = query_hash['query_operator']
|
||||
|
||||
@rule.conditions.each_with_index do |query_hash, current_index|
|
||||
current_filter = conversation_filters[query_hash['attribute_key']]
|
||||
@query_string += conversation_query_string(current_filter, query_hash.with_indifferent_access, current_index)
|
||||
filter_operator_value = filter_operation(query_hash, current_index)
|
||||
|
||||
case current_filter['attribute_type']
|
||||
when 'additional_attributes'
|
||||
" contacts.additional_attributes ->> '#{attribute_key}' #{filter_operator_value} #{query_operator} "
|
||||
when 'standard'
|
||||
" contacts.#{attribute_key} #{filter_operator_value} #{query_operator} "
|
||||
end
|
||||
|
||||
records = base_relation.where(@query_string, @filter_values.with_indifferent_access)
|
||||
records.any?
|
||||
end
|
||||
|
||||
def conversation_query_string(table_name, current_filter, query_hash, current_index)
|
||||
@@ -91,6 +90,12 @@ class AutomationRules::ConditionsFilterService < FilterService
|
||||
private
|
||||
|
||||
def base_relation
|
||||
Conversation.where(id: @conversation.id).joins('LEFT OUTER JOIN contacts on conversations.contact_id = contacts.id')
|
||||
records = Conversation.where(id: @conversation.id).joins(
|
||||
'LEFT OUTER JOIN contacts on conversations.contact_id = contacts.id'
|
||||
).joins(
|
||||
'LEFT OUTER JOIN messages on messages.conversation_id = conversations.id'
|
||||
)
|
||||
records = records.where(messages: { id: @options[:message].id }) if @options[:message].present?
|
||||
records
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user