diff --git a/app/services/suggester/users/recent.rb b/app/services/suggester/users/recent.rb index 51750c0b3..9e97c5385 100644 --- a/app/services/suggester/users/recent.rb +++ b/app/services/suggester/users/recent.rb @@ -23,7 +23,7 @@ module Suggester def tagged_article_user_ids(num_weeks = 1) Article.published .tagged_with(user.decorate.cached_followed_tag_names.sample(5), any: true) - .where("score > ? AND published_at > ?", article_reaction_count, num_weeks.weeks.ago) + .where("score >= ? AND published_at >= ?", article_score_average, num_weeks.weeks.ago) .pluck(:user_id) .each_with_object(Hash.new(0)) { |value, counts| counts[value] += 1 } .sort_by { |_key, value| value } @@ -39,7 +39,7 @@ module Suggester def recent_top_producers relation = User.where( - "articles_count > ? AND comments_count > ?", + "articles_count >= ? AND comments_count >= ?", established_user_article_count, established_user_comment_count ) relation = relation.select(attributes_to_select) if attributes_to_select @@ -55,15 +55,21 @@ module Suggester end def established_user_article_count - Rails.env.production? ? 4 : -1 + Rails.cache.fetch("established_user_article_count", expires_in: 1.day) do + User.where("articles_count > 0").average(:articles_count) || User.average(:articles_count) + end end def established_user_comment_count - Rails.env.production? ? 4 : -1 + Rails.cache.fetch("established_user_comment_count", expires_in: 1.day) do + User.where("comments_count > 0").average(:comments_count) || User.average(:comments_count) + end end - def article_reaction_count - Rails.env.production? ? 15 : -1 + def article_score_average + Rails.cache.fetch("article_score_average", expires_in: 1.day) do + Article.where("score >= 0").average(:score) || Article.average(:score) + end end end end diff --git a/spec/services/suggester/users/recent_spec.rb b/spec/services/suggester/users/recent_spec.rb index c9481e8f0..edefc1261 100644 --- a/spec/services/suggester/users/recent_spec.rb +++ b/spec/services/suggester/users/recent_spec.rb @@ -2,14 +2,36 @@ require "rails_helper" RSpec.describe Suggester::Users::Recent, type: :service, vcr: {} do let(:user) { create(:user) } + let(:suggester) { described_class.new(user) } it "does not include calling user" do create_list(:user, 3) - expect(described_class.new(user).suggest).not_to include(user) + expect(suggester.suggest).not_to include(user) end - it "returns the same number created" do - create_list(:user, 3) - expect(described_class.new(user).suggest.size).to eq(3) + context "with cached_followed_tags" do + it "returns recent producers" do + articles = create_list(:article, 3, score: 10) + article = articles.last + article.update(score: 100) + allow(user).to receive(:decorate).and_return(user) + allow(user).to receive(:cached_followed_tag_names).and_return(["css"]) + + suggested_users = suggester.suggest + expect(suggested_users.size).to eq(1) + expect(suggested_users.map(&:id)).to include(article.user_id) + end + end + + context "without cached_followed_tags" do + it "returns recent_commenters and recent top producers" do + productive_user = create(:user, comments_count: 1, articles_count: 1) + unproductive_user = create(:user, comments_count: 0, articles_count: 0) + + suggested_users = suggester.suggest + expect(suggested_users.size).to eq(1) + expect(suggested_users.map(&:id)).to include(productive_user.id) + expect(suggested_users.map(&:id)).not_to include(unproductive_user.id) + end end end