fix: SQL error when rules with missing attributes is triggered (#8673)

This commit is contained in:
Shivam Mishra
2024-01-22 16:09:34 +05:30
committed by GitHub
parent bc04d81a5a
commit 1dc66db516
5 changed files with 181 additions and 4 deletions

View File

@@ -0,0 +1,56 @@
class AutomationRules::ConditionValidationService
ATTRIBUTE_MODEL = 'conversation_attribute'.freeze
def initialize(rule)
@rule = rule
@account = rule.account
file = File.read('./lib/filters/filter_keys.json')
@filters = JSON.parse(file)
@conversation_filters = @filters['conversations']
@contact_filters = @filters['contacts']
@message_filters = @filters['messages']
end
def perform
@rule.conditions.each do |condition|
return false unless valid_condition?(condition)
end
true
end
private
def valid_condition?(condition)
key = condition['attribute_key']
conversation_filter = @conversation_filters[key]
contact_filter = @contact_filters[key]
message_filter = @message_filters[key]
if conversation_filter || contact_filter || message_filter
operation_valid?(condition, conversation_filter || contact_filter || message_filter)
else
custom_attribute_present?(key, condition['custom_attribute_type'])
end
end
def operation_valid?(condition, filter)
filter_operator = condition['filter_operator']
# attribute changed is a special case
return true if filter_operator == 'attribute_changed'
filter['filter_operators'].include?(filter_operator)
end
def custom_attribute_present?(attribute_key, attribute_model)
attribute_model = attribute_model.presence || self.class::ATTRIBUTE_MODEL
@account.custom_attribute_definitions.where(
attribute_model: attribute_model
).find_by(attribute_key: attribute_key).present?
end
end

View File

@@ -5,19 +5,25 @@ class AutomationRules::ConditionsFilterService < FilterService
def initialize(rule, conversation = nil, options = {})
super([], nil)
# assign rule, conversation and account to instance variables
@rule = rule
@conversation = conversation
@account = conversation.account
# setup filters from json file
file = File.read('./lib/filters/filter_keys.json')
@filters = JSON.parse(file)
@conversation_filters = @filters['conversations']
@contact_filters = @filters['contacts']
@message_filters = @filters['messages']
@options = options
@changed_attributes = options[:changed_attributes]
end
def perform
@conversation_filters = @filters['conversations']
@contact_filters = @filters['contacts']
@message_filters = @filters['messages']
return false unless rule_valid?
@attribute_changed_query_filter = []
@rule.conditions.each_with_index do |query_hash, current_index|
@@ -36,6 +42,14 @@ class AutomationRules::ConditionsFilterService < FilterService
false
end
def rule_valid?
is_valid = AutomationRules::ConditionValidationService.new(@rule).perform
Rails.logger.info "Automation rule condition validation failed for rule id: #{@rule.id}" unless is_valid
is_valid
end
def filter_operation(query_hash, current_index)
if query_hash[:filter_operator] == 'starts_with'
@filter_values["value_#{current_index}"] = "#{string_filter_values(query_hash)}%"