discourse/lib/suggested_topics_builder.rb

91 lines
2.2 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2013-07-12 14:38:20 -04:00
require_dependency 'topic_list'
class SuggestedTopicsBuilder
attr_reader :excluded_topic_ids
def initialize(topic)
@excluded_topic_ids = [topic.id]
@category_id = topic.category_id
2016-07-18 22:34:54 -04:00
@category_topic_ids = Category.topic_ids
2013-07-12 14:38:20 -04:00
@results = []
end
2017-07-27 21:20:09 -04:00
def add_results(results, priority = :low)
2013-07-12 14:38:20 -04:00
# WARNING .blank? will execute an Active Record query
return unless results
2013-07-12 14:38:20 -04:00
# Only add results if we don't have those topic ids already
results = results
.where('topics.id NOT IN (?)', @excluded_topic_ids)
2017-07-27 21:20:09 -04:00
.where(visible: true)
# If limit suggested to category is enabled, restrict to that category
if @category_id && SiteSetting.limit_suggested_to_category?
results = results.where(category_id: @category_id)
end
2017-09-08 01:10:37 -04:00
results = results.to_a
results.reject! { |topic| @category_topic_ids.include?(topic.id) }
2013-07-12 14:38:20 -04:00
unless results.empty?
# protect against dupes
temp = results
results = []
temp.each do |r|
if !@excluded_topic_ids.include?(r.id)
results << r
@excluded_topic_ids << r.id
end
end
2017-07-27 21:20:09 -04:00
splice_results(results, priority)
end
end
def splice_results(results, priority)
if priority == :ultra_high
@results.insert 0, *results
elsif @category_id && priority == :high
# Topics from category @category_id need to be first in the list, all others after.
other_category_index = @results.index { |r| r.category_id != @category_id }
2017-07-27 21:20:09 -04:00
category_results, other_category_results = results.partition { |r| r.category_id == @category_id }
if other_category_index
@results.insert other_category_index, *category_results
else
@results.concat category_results
end
@results.concat other_category_results
else
@results.concat results
end
2013-07-12 14:38:20 -04:00
end
def results
@results.first(SiteSetting.suggested_topics)
end
2013-07-12 14:38:20 -04:00
def results_left
SiteSetting.suggested_topics - @results.size
end
def full?
results_left <= 0
end
def category_results_left
2017-07-27 21:20:09 -04:00
SiteSetting.suggested_topics - @results.count { |r| r.category_id == @category_id }
end
2013-07-12 14:38:20 -04:00
def size
@results.size
end
end