DEV: Add post_id parameter to reset_bump_date route (#25372)
This would allow a theme component (or an API call) to reset the bump date of a topic to a given post's created_at date. I picked `post_id` as the parameter here because it provides a bit of extra protection against accidentally resetting the bump date to a date that doesn't make sense.
This commit is contained in:
parent
2b30cca0e4
commit
c1577019c8
|
@ -1151,12 +1151,14 @@ class TopicsController < ApplicationController
|
||||||
|
|
||||||
def reset_bump_date
|
def reset_bump_date
|
||||||
params.require(:id)
|
params.require(:id)
|
||||||
|
params.permit(:post_id)
|
||||||
|
|
||||||
guardian.ensure_can_update_bumped_at!
|
guardian.ensure_can_update_bumped_at!
|
||||||
|
|
||||||
topic = Topic.find_by(id: params[:id])
|
topic = Topic.find_by(id: params[:id])
|
||||||
raise Discourse::NotFound.new unless topic
|
raise Discourse::NotFound.new unless topic
|
||||||
|
|
||||||
topic.reset_bumped_at
|
topic.reset_bumped_at(params[:post_id])
|
||||||
render body: nil
|
render body: nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1858,13 +1858,21 @@ class Topic < ActiveRecord::Base
|
||||||
@is_category_topic ||= Category.exists?(topic_id: self.id.to_i)
|
@is_category_topic ||= Category.exists?(topic_id: self.id.to_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
def reset_bumped_at
|
def reset_bumped_at(post_id = nil)
|
||||||
post =
|
post =
|
||||||
ordered_posts.where(
|
(
|
||||||
user_deleted: false,
|
if post_id
|
||||||
hidden: false,
|
Post.find_by(id: post_id)
|
||||||
post_type: Post.types[:regular],
|
else
|
||||||
).last || first_post
|
ordered_posts.where(
|
||||||
|
user_deleted: false,
|
||||||
|
hidden: false,
|
||||||
|
post_type: Post.types[:regular],
|
||||||
|
).last || first_post
|
||||||
|
end
|
||||||
|
)
|
||||||
|
|
||||||
|
return if !post
|
||||||
|
|
||||||
self.bumped_at = post.created_at
|
self.bumped_at = post.created_at
|
||||||
self.save(validate: false)
|
self.save(validate: false)
|
||||||
|
|
|
@ -1237,7 +1237,11 @@ Discourse::Application.routes.draw do
|
||||||
put "t/:id/convert-topic/:type" => "topics#convert_topic"
|
put "t/:id/convert-topic/:type" => "topics#convert_topic"
|
||||||
put "t/:id/publish" => "topics#publish"
|
put "t/:id/publish" => "topics#publish"
|
||||||
put "t/:id/shared-draft" => "topics#update_shared_draft"
|
put "t/:id/shared-draft" => "topics#update_shared_draft"
|
||||||
put "t/:id/reset-bump-date" => "topics#reset_bump_date"
|
put "t/:id/reset-bump-date/(:post_id)" => "topics#reset_bump_date",
|
||||||
|
:constraints => {
|
||||||
|
id: /\d+/,
|
||||||
|
post_id: /\d+/,
|
||||||
|
}
|
||||||
put "topics/bulk"
|
put "topics/bulk"
|
||||||
put "topics/reset-new" => "topics#reset_new"
|
put "topics/reset-new" => "topics#reset_new"
|
||||||
put "topics/pm-reset-new" => "topics#private_message_reset_new"
|
put "topics/pm-reset-new" => "topics#private_message_reset_new"
|
||||||
|
|
|
@ -5298,6 +5298,28 @@ RSpec.describe TopicsController do
|
||||||
expect(topic.reload.bumped_at).to eq_time(timestamp)
|
expect(topic.reload.bumped_at).to eq_time(timestamp)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with a post_id parameter" do
|
||||||
|
before { sign_in(admin) }
|
||||||
|
|
||||||
|
it "resets bump correctly" do
|
||||||
|
post1 = Fabricate(:post, user: post_author1, topic: topic, created_at: 2.days.ago)
|
||||||
|
post2 = Fabricate(:post, user: post_author1, topic: topic, created_at: 1.day.ago)
|
||||||
|
|
||||||
|
put "/t/#{topic.id}/reset-bump-date/#{post1.id}.json"
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
expect(topic.reload.bumped_at).to eq_time(post1.created_at)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not raise an error for an inexistent post" do
|
||||||
|
id = (SecureRandom.random_number * 100_000_000).to_i
|
||||||
|
original_bumped_at = topic.bumped_at
|
||||||
|
|
||||||
|
put "/t/#{topic.id}/reset-bump-date/#{id}.json"
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
expect(topic.reload.bumped_at).to eq_time(original_bumped_at)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#private_message_reset_new" do
|
describe "#private_message_reset_new" do
|
||||||
|
|
Loading…
Reference in New Issue