mirror of
https://github.com/discourse/discourse.git
synced 2024-11-22 15:25:35 +08:00
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
|
||||
params.require(:id)
|
||||
params.permit(:post_id)
|
||||
|
||||
guardian.ensure_can_update_bumped_at!
|
||||
|
||||
topic = Topic.find_by(id: params[:id])
|
||||
raise Discourse::NotFound.new unless topic
|
||||
|
||||
topic.reset_bumped_at
|
||||
topic.reset_bumped_at(params[:post_id])
|
||||
render body: nil
|
||||
end
|
||||
|
||||
|
|
|
@ -1858,13 +1858,21 @@ class Topic < ActiveRecord::Base
|
|||
@is_category_topic ||= Category.exists?(topic_id: self.id.to_i)
|
||||
end
|
||||
|
||||
def reset_bumped_at
|
||||
def reset_bumped_at(post_id = nil)
|
||||
post =
|
||||
ordered_posts.where(
|
||||
user_deleted: false,
|
||||
hidden: false,
|
||||
post_type: Post.types[:regular],
|
||||
).last || first_post
|
||||
(
|
||||
if post_id
|
||||
Post.find_by(id: post_id)
|
||||
else
|
||||
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.save(validate: false)
|
||||
|
|
|
@ -1237,7 +1237,11 @@ Discourse::Application.routes.draw do
|
|||
put "t/:id/convert-topic/:type" => "topics#convert_topic"
|
||||
put "t/:id/publish" => "topics#publish"
|
||||
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/reset-new" => "topics#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)
|
||||
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
|
||||
|
||||
describe "#private_message_reset_new" do
|
||||
|
|
Loading…
Reference in New Issue
Block a user