diff --git a/app/controllers/admin/configs_controller.rb b/app/controllers/admin/configs_controller.rb
index 1e2867866..7dfff7fc4 100644
--- a/app/controllers/admin/configs_controller.rb
+++ b/app/controllers/admin/configs_controller.rb
@@ -80,6 +80,7 @@ module Admin
onboarding_taskcard_image
suggested_tags
suggested_users
+ prefer_manual_suggested_users
].freeze
JOB_PARAMS =
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 2e8a477d1..b535c2c87 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -260,6 +260,8 @@ class UsersController < ApplicationController
end
def determine_follow_suggestions(current_user)
+ return default_suggested_users if SiteConfig.prefer_manual_suggested_users? && default_suggested_users
+
recent_suggestions = Suggester::Users::Recent.new(
current_user,
attributes_to_select: INDEX_ATTRIBUTES_FOR_SERIALIZATION,
diff --git a/app/lib/constants/site_config.rb b/app/lib/constants/site_config.rb
index 7aefce1a7..87aaec400 100644
--- a/app/lib/constants/site_config.rb
+++ b/app/lib/constants/site_config.rb
@@ -303,11 +303,15 @@ module Constants
placeholder: "List of valid tags: comma separated, letters only e.g. beginners,javascript,ruby,swift,kotlin"
},
suggested_users: {
- description: "Determines which users are suggested to follow to new users during onboarding (comma" \
- "separated, letters only). Please note that these users will be shown as a fallback if no" \
+ description: "Determines which users are suggested to follow to new users during onboarding (comma " \
+ "separated, letters only). Please note that these users will be shown as a fallback if no " \
"recently-active commenters or producers can be suggested",
placeholder: "List of valid usernames: comma separated, letters only e.g. ben,jess,peter,maestromac,andy,liana"
},
+ prefer_manual_suggested_users: {
+ description: "Always show suggested users as suggested people to follow even when " \
+ "auto-suggestion is available"
+ },
tag_feed_minimum_score: {
description: "Minimum score needed for a post to show up on default tag page.",
placeholder: "0"
diff --git a/app/models/site_config.rb b/app/models/site_config.rb
index fca2f407a..8831e4b20 100644
--- a/app/models/site_config.rb
+++ b/app/models/site_config.rb
@@ -132,6 +132,7 @@ class SiteConfig < RailsSettings::Base
field :onboarding_taskcard_image, type: :string
field :suggested_tags, type: :array, default: %w[]
field :suggested_users, type: :array, default: %w[]
+ field :prefer_manual_suggested_users, type: :boolean, default: false
# Rate limits and spam prevention
field :rate_limit_follow_count_daily, type: :integer, default: 500
diff --git a/app/views/admin/configs/show.html.erb b/app/views/admin/configs/show.html.erb
index f2045b8cb..5e3e01b7d 100644
--- a/app/views/admin/configs/show.html.erb
+++ b/app/views/admin/configs/show.html.erb
@@ -1109,6 +1109,16 @@
placeholder: Constants::SiteConfig::DETAILS[:suggested_users][:placeholder] %>
+
+ <%= f.check_box :prefer_manual_suggested_users, checked: SiteConfig.prefer_manual_suggested_users, class: "crayons-checkbox" %>
+
+ <%= admin_config_label :prefer_manual_suggested_users %>
+
+ <%= Constants::SiteConfig::DETAILS[:prefer_manual_suggested_users][:description] %>
+
+
+
+
<%= render "form_submission", f: f %>
diff --git a/spec/requests/admin/configs_spec.rb b/spec/requests/admin/configs_spec.rb
index 95c49b8af..479b6a75d 100644
--- a/spec/requests/admin/configs_spec.rb
+++ b/spec/requests/admin/configs_spec.rb
@@ -474,6 +474,20 @@ RSpec.describe "/admin/config", type: :request do
}
expect(SiteConfig.suggested_users).to eq(%w[piglet tigger eeyore christopherrobin kanga roo])
end
+
+ it "updates prefer_manual_suggested_users to true" do
+ prefer_manual = true
+ post "/admin/config", params: { site_config: { prefer_manual_suggested_users: prefer_manual },
+ confirmation: confirmation_message }
+ expect(SiteConfig.prefer_manual_suggested_users).to eq(prefer_manual)
+ end
+
+ it "updates prefer_manual_suggested_users to false" do
+ prefer_manual = false
+ post "/admin/config", params: { site_config: { prefer_manual_suggested_users: prefer_manual },
+ confirmation: confirmation_message }
+ expect(SiteConfig.prefer_manual_suggested_users).to eq(prefer_manual)
+ end
end
describe "Rate Limits and spam" do
diff --git a/spec/requests/user/user_suggestions_spec.rb b/spec/requests/user/user_suggestions_spec.rb
index 4b5e01970..a922c42dd 100644
--- a/spec/requests/user/user_suggestions_spec.rb
+++ b/spec/requests/user/user_suggestions_spec.rb
@@ -39,14 +39,17 @@ RSpec.describe "Users", type: :request do
end
context "when follow_suggestions params are present" do
- it "returns follow suggestions for an authenticated user" do
- user = create(:user)
- tag = create(:tag)
+ let(:user) { create(:user) }
+ let(:tag) { create(:tag) }
+ let(:other_user) { create(:user) }
+
+ before do
+ # Prepare auto-generated user suggestions
user.follow(tag)
-
- other_user = create(:user)
create(:article, user: other_user, tags: [tag.name])
+ end
+ it "returns follow suggestions for an authenticated user" do
sign_in user
get users_path(state: "follow_suggestions")
@@ -56,13 +59,6 @@ RSpec.describe "Users", type: :request do
end
it "returns follow suggestions that have profile images" do
- user = create(:user)
- tag = create(:tag)
- user.follow(tag)
-
- other_user = create(:user)
- create(:article, user: other_user, tags: [tag.name])
-
sign_in user
get users_path(state: "follow_suggestions")
@@ -70,6 +66,24 @@ RSpec.describe "Users", type: :request do
response_user = response.parsed_body.first
expect(response_user["profile_image_url"]).to eq(other_user.profile_image_url)
end
+
+ it "returns the default suggested_users from SiteConfig if prefer_manual_suggested_users is true" do
+ allow(SiteConfig).to receive(:prefer_manual_suggested_users).and_return(true)
+
+ sign_in user
+
+ get users_path(state: "follow_suggestions")
+
+ expect(response).to have_http_status(:ok)
+ expect(response.parsed_body.first).to include(
+ "id" => suggested_user.id,
+ "name" => suggested_user.name,
+ "username" => suggested_user.username,
+ "summary" => suggested_user.summary,
+ "profile_image_url" => Images::Profile.call(suggested_user.profile_image_url, length: 90),
+ "following" => false,
+ )
+ end
end
context "when sidebar_suggestions params are present" do