48 Zeilen
1,1 KiB
Ruby
48 Zeilen
1,1 KiB
Ruby
# frozen_string_literal: true
|
|
class CustomWizard::RealtimeValidation::SimilarTopics
|
|
attr_accessor :user
|
|
|
|
def initialize(user)
|
|
@user = user
|
|
end
|
|
|
|
class SimilarTopic
|
|
def initialize(topic)
|
|
@topic = topic
|
|
end
|
|
|
|
attr_reader :topic
|
|
|
|
def blurb
|
|
Search::GroupedSearchResults.blurb_for(cooked: @topic.try(:blurb))
|
|
end
|
|
end
|
|
|
|
def perform(params)
|
|
title = params[:title]
|
|
raw = params[:raw]
|
|
categories = params[:categories]
|
|
time_n_value = params[:time_n_value]
|
|
time_unit = params[:time_unit]
|
|
|
|
result = CustomWizard::RealtimeValidation::Result.new(:similar_topic)
|
|
|
|
if title.length < SiteSetting.min_title_similar_length || !Topic.count_exceeds_minimum?
|
|
return result
|
|
end
|
|
|
|
topics = Topic.similar_to(title, raw, user).to_a
|
|
topics.select! { |t| categories.include?(t.category.id.to_s) } if categories.present?
|
|
|
|
if time_n_value.to_i > 0 && time_unit.present?
|
|
topics.select! { |t| t.created_at >= time_n_value.to_i.send(time_unit).ago }
|
|
end
|
|
|
|
topics.map! { |t| SimilarTopic.new(t) }
|
|
|
|
result.items = topics
|
|
result.serializer_opts = { root: :similar_topics }
|
|
|
|
result
|
|
end
|
|
end
|