From f186e3e80b018e22254a156392d31bfc00f6b7b7 Mon Sep 17 00:00:00 2001 From: Guhyoun Nam <70915823+rngus2344@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:11:33 -0600 Subject: [PATCH] DEV: Add categories_and_hot Route (#29948) This PR adds a route to categories_and_hot and methods in categories_controller. --- app/controllers/categories_controller.rb | 17 ++++++++++- config/routes.rb | 1 + spec/requests/categories_controller_spec.rb | 31 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 82a8949e641..3938a29874b 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -7,6 +7,7 @@ class CategoriesController < ApplicationController index categories_and_latest categories_and_top + categories_and_hot show redirect find_by_slug @@ -17,7 +18,14 @@ class CategoriesController < ApplicationController before_action :fetch_category, only: %i[show update destroy visible_groups] before_action :initialize_staff_action_logger, only: %i[create update destroy] - skip_before_action :check_xhr, only: %i[index categories_and_latest categories_and_top redirect] + skip_before_action :check_xhr, + only: %i[ + index + categories_and_latest + categories_and_top + categories_and_hot + redirect + ] skip_before_action :verify_authenticity_token, only: %i[search] SYMMETRICAL_CATEGORIES_TO_TOPICS_FACTOR = 1.5 @@ -74,6 +82,10 @@ class CategoriesController < ApplicationController categories_and_topics(:top) end + def categories_and_hot + categories_and_topics(:hot) + end + def move guardian.ensure_can_create_category! @@ -650,6 +662,9 @@ class CategoriesController < ApplicationController SiteSetting.top_page_default_timeframe.to_sym, ) @topic_list.more_topics_url = url_for(top_path) + when "categories_and_hot_topics" + @topic_list = TopicQuery.new(current_user, topic_options).list_hot + @topic_list.more_topics_url = url_for(hot_path) end @topic_list diff --git a/config/routes.rb b/config/routes.rb index a8bfcf266bc..ea34bf4be68 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1215,6 +1215,7 @@ Discourse::Application.routes.draw do get "categories_and_latest" => "categories#categories_and_latest" get "categories_and_top" => "categories#categories_and_top" + get "categories_and_hot" => "categories#categories_and_hot" get "c/:id/show" => "categories#show" get "c/:id/visible_groups" => "categories#visible_groups" diff --git a/spec/requests/categories_controller_spec.rb b/spec/requests/categories_controller_spec.rb index 1d5e37d80ab..450d0fe529f 100644 --- a/spec/requests/categories_controller_spec.rb +++ b/spec/requests/categories_controller_spec.rb @@ -1053,6 +1053,17 @@ RSpec.describe CategoriesController do expect(response.parsed_body["topic_list"]["more_topics_url"]).to start_with("/top") end + it "includes more_topics_url in the response to /categories_and_hot" do + SiteSetting.categories_topics = 5 + + Fabricate.times(10, :topic, category: category, like_count: 1000, posts_count: 100) + TopicHotScore.update_scores + + get "/categories_and_hot.json" + expect(response.status).to eq(200) + expect(response.parsed_body["topic_list"]["more_topics_url"]).to start_with("/hot") + end + describe "Showing top topics from private categories" do it "returns the top topic from the private category when the user is a member" do restricted_group = Fabricate(:group) @@ -1072,6 +1083,26 @@ RSpec.describe CategoriesController do expect(parsed_topic).to be_present end end + + describe "Showing hot topics from private categories" do + it "returns the hot topic from the private category when the user is a member" do + restricted_group = Fabricate(:group) + private_cat = Fabricate(:private_category, group: restricted_group) + private_topic = Fabricate(:topic, category: private_cat, like_count: 1000, posts_count: 100) + TopicHotScore.update_scores + restricted_group.add(user) + sign_in(user) + + get "/categories_and_hot.json" + parsed_topic = + response + .parsed_body + .dig("topic_list", "topics") + .detect { |t| t.dig("id") == private_topic.id } + + expect(parsed_topic).to be_present + end + end end describe "#visible_groups" do