diff --git a/app/services/suggester/users/sidebar.rb b/app/services/suggester/users/sidebar.rb index 0b0e2a888..c6c278967 100644 --- a/app/services/suggester/users/sidebar.rb +++ b/app/services/suggester/users/sidebar.rb @@ -4,33 +4,39 @@ module Suggester def initialize(user, given_tag) @user = user @given_tag = given_tag + @minimum_reaction_count = Rails.env.production? ? 25 : 0 end def suggest - Rails.cache.fetch(generate_cache_name, expires_in: 120.hours) do - reaction_count = Rails.env.production? ? 25 : 0 - user_ids = Article.published.tagged_with([given_tag], any: true). - where("public_reactions_count > ?", reaction_count). - where("published_at > ?", 4.months.ago). - where("user_id != ?", user.id). - where.not(user_id: user.following_by_type("User")). - pluck(:user_id) - group_one = User.select(:id, :name, :username, :profile_image, :summary). - where(id: user_ids). - order("reputation_modifier DESC").limit(20).to_a - group_two = User.select(:id, :name, :username, :profile_image, :summary). - where(id: user_ids). - order(Arel.sql("RANDOM()")).limit(20).to_a - (group_one + group_two).uniq + suggested_user_ids = Rails.cache.fetch(generate_cache_name, expires_in: 120.hours) do + (reputable_user_ids + random_user_ids).uniq end + User.select(:id, :name, :username, :profile_image, :summary).where(id: suggested_user_ids) end private - attr_reader :user, :given_tag + attr_reader :user, :given_tag, :minimum_reaction_count def generate_cache_name - "tag-#{given_tag}_user-#{user.id}-#{user.last_followed_at}/tag-follow-sugggestions" + "tag-#{given_tag}-user-#{user.id}-#{user.last_followed_at}/tag-follow-suggestions" + end + + def active_authors_for_given_tags + @active_authors_for_given_tags ||= Article.published.tagged_with([given_tag], any: true). + where("public_reactions_count >= ?", minimum_reaction_count). + where("published_at > ?", 4.months.ago). + where("user_id != ?", user.id). + where.not(user_id: user.following_by_type("User")). + pluck(:user_id) + end + + def reputable_user_ids + User.where(id: active_authors_for_given_tags).order("reputation_modifier DESC").limit(20).pluck(:id) + end + + def random_user_ids + User.where(id: active_authors_for_given_tags).order(Arel.sql("RANDOM()")).limit(20).pluck(:id) end end end diff --git a/spec/services/suggester/users/sidebar_spec.rb b/spec/services/suggester/users/sidebar_spec.rb index 149e15baf..00f852768 100644 --- a/spec/services/suggester/users/sidebar_spec.rb +++ b/spec/services/suggester/users/sidebar_spec.rb @@ -3,17 +3,16 @@ require "rails_helper" RSpec.describe Suggester::Users::Sidebar, type: :service do let(:user) { create(:user) } - it "does not include calling user" do - create_list(:user, 3) - tags = [] - 3.times { tags << create(:tag) } - expect(described_class.new(user, tags).suggest).not_to include(user) + it "returns user suggestions" do + tags = "html" + article1 = create(:article, tags: tags) + article2 = create(:article, tags: tags) + expect(described_class.new(user, tags).suggest.to_a).to eq([article1.user, article2.user]) end - it "returns the same number created" do + it "returns no user if there's not enough sample" do create_list(:user, 3) - tags = [] - 3.times { tags << create(:tag) } - expect(described_class.new(user, tags).suggest.size).to eq(0) + tags = create_list(:tag, 3) + expect(described_class.new(user, tags).suggest).to be_empty end end