DEV: Add categories_and_hot Route (#29948)

This PR adds a route to categories_and_hot and methods in categories_controller.
This commit is contained in:
Guhyoun Nam 2024-11-27 11:11:33 -06:00 committed by GitHub
parent b4406861ae
commit f186e3e80b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 48 additions and 1 deletions

View File

@ -7,6 +7,7 @@ class CategoriesController < ApplicationController
index index
categories_and_latest categories_and_latest
categories_and_top categories_and_top
categories_and_hot
show show
redirect redirect
find_by_slug find_by_slug
@ -17,7 +18,14 @@ class CategoriesController < ApplicationController
before_action :fetch_category, only: %i[show update destroy visible_groups] before_action :fetch_category, only: %i[show update destroy visible_groups]
before_action :initialize_staff_action_logger, only: %i[create update destroy] 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] skip_before_action :verify_authenticity_token, only: %i[search]
SYMMETRICAL_CATEGORIES_TO_TOPICS_FACTOR = 1.5 SYMMETRICAL_CATEGORIES_TO_TOPICS_FACTOR = 1.5
@ -74,6 +82,10 @@ class CategoriesController < ApplicationController
categories_and_topics(:top) categories_and_topics(:top)
end end
def categories_and_hot
categories_and_topics(:hot)
end
def move def move
guardian.ensure_can_create_category! guardian.ensure_can_create_category!
@ -650,6 +662,9 @@ class CategoriesController < ApplicationController
SiteSetting.top_page_default_timeframe.to_sym, SiteSetting.top_page_default_timeframe.to_sym,
) )
@topic_list.more_topics_url = url_for(top_path) @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 end
@topic_list @topic_list

View File

@ -1215,6 +1215,7 @@ Discourse::Application.routes.draw do
get "categories_and_latest" => "categories#categories_and_latest" get "categories_and_latest" => "categories#categories_and_latest"
get "categories_and_top" => "categories#categories_and_top" 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/show" => "categories#show"
get "c/:id/visible_groups" => "categories#visible_groups" get "c/:id/visible_groups" => "categories#visible_groups"

View File

@ -1053,6 +1053,17 @@ RSpec.describe CategoriesController do
expect(response.parsed_body["topic_list"]["more_topics_url"]).to start_with("/top") expect(response.parsed_body["topic_list"]["more_topics_url"]).to start_with("/top")
end 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 describe "Showing top topics from private categories" do
it "returns the top topic from the private category when the user is a member" do it "returns the top topic from the private category when the user is a member" do
restricted_group = Fabricate(:group) restricted_group = Fabricate(:group)
@ -1072,6 +1083,26 @@ RSpec.describe CategoriesController do
expect(parsed_topic).to be_present expect(parsed_topic).to be_present
end end
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 end
describe "#visible_groups" do describe "#visible_groups" do