Files
clientsflow/research/chatwoot/enterprise/app/services/enterprise/search_service.rb

89 lines
2.4 KiB
Ruby

module Enterprise::SearchService
def advanced_search
where_conditions = build_where_conditions
apply_filters(where_conditions)
Message.search(
search_query,
fields: %w[content attachments.transcribed_text content_attributes.email.subject],
where: where_conditions,
order: { created_at: :desc },
page: params[:page] || 1,
per_page: 15
)
end
private
def build_where_conditions
conditions = { account_id: current_account.id }
conditions[:inbox_id] = accessable_inbox_ids unless should_skip_inbox_filtering?
conditions
end
def apply_filters(where_conditions)
apply_from_filter(where_conditions)
apply_time_range_filter(where_conditions)
apply_inbox_filter(where_conditions)
end
def apply_from_filter(where_conditions)
sender_type, sender_id = parse_from_param(params[:from])
return unless sender_type && sender_id
where_conditions[:sender_type] = sender_type
where_conditions[:sender_id] = sender_id
end
def parse_from_param(from_param)
return [nil, nil] unless from_param&.match?(/\A(contact|agent):\d+\z/)
type, id = from_param.split(':')
sender_type = type == 'agent' ? 'User' : 'Contact'
[sender_type, id.to_i]
end
def apply_time_range_filter(where_conditions)
time_conditions = {}
time_conditions[:gte] = enforce_time_limit(params[:since])
time_conditions[:lte] = cap_until_time(params[:until]) if params[:until].present?
where_conditions[:created_at] = time_conditions if time_conditions.any?
end
def cap_until_time(until_param)
max_future = 90.days.from_now
requested_time = Time.zone.at(until_param.to_i)
[requested_time, max_future].min
end
def enforce_time_limit(since_param)
max_lookback = Limits::MESSAGE_SEARCH_TIME_RANGE_LIMIT_DAYS.days.ago
if since_param.present?
requested_time = Time.zone.at(since_param.to_i)
# Silently cap to max_lookback if requested time is too far back
[requested_time, max_lookback].max
else
max_lookback
end
end
def apply_inbox_filter(where_conditions)
return if params[:inbox_id].blank?
inbox_id = params[:inbox_id].to_i
return if inbox_id.zero?
return unless validate_inbox_access(inbox_id)
where_conditions[:inbox_id] = inbox_id
end
def validate_inbox_access(inbox_id)
return true if should_skip_inbox_filtering?
accessable_inbox_ids.include?(inbox_id)
end
end