mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 08:03:40 +08:00
367de2594d
* FIX: Unlike own posts on ownership transfer If a user has liked a post that has passed the `post_undo_action_window_mins` system setting window and you transfer ownership of that post to that user you will be the owner of a post that you have liked, but cannot unlike resulting in a weird UI behavior. This commit fixes this issue. The existing tests didn't check for the timeout window for unliking posts so I added that in. I couldn't find a good way to do this logic inside of the guardian class so rather than duplicating behavior of the `PostActionDestroyer` class inside of the `PostOwnerChanger` I decided to pass in a "bypass" variable that could be used to check if the calling class is the 'post_owner_changer' and bypass the guardian instead. I went this route because the guardian `can_delete_post_action` method has no way of distinguishing how to allow a user to be able to unlike their own posts after the timeout window but only on a post owner change. * use an options hash instead
45 lines
1.4 KiB
Ruby
45 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class PostOwnerChanger
|
|
|
|
def initialize(params)
|
|
@post_ids = params[:post_ids]
|
|
@topic = Topic.with_deleted.find_by(id: params[:topic_id].to_i)
|
|
@new_owner = params[:new_owner]
|
|
@acting_user = params[:acting_user]
|
|
@skip_revision = params[:skip_revision] || false
|
|
|
|
raise ArgumentError unless @post_ids && @topic && @new_owner && @acting_user
|
|
end
|
|
|
|
def change_owner!
|
|
@post_ids.each do |post_id|
|
|
next unless post = Post.with_deleted.find_by(id: post_id, topic_id: @topic.id)
|
|
|
|
if post.is_first_post?
|
|
@topic.user = @new_owner
|
|
@topic.recover! if post.user.nil?
|
|
end
|
|
|
|
post.topic = @topic
|
|
post.set_owner(@new_owner, @acting_user, @skip_revision)
|
|
PostActionDestroyer.destroy(@new_owner, post, :like, skip_delete_check: true)
|
|
|
|
level = post.is_first_post? ? :watching : :tracking
|
|
TopicUser.change(@new_owner.id, @topic.id, notification_level: NotificationLevels.topic_levels[level])
|
|
|
|
if post == @topic.posts.order("post_number DESC").where("NOT hidden AND posts.deleted_at IS NULL").first
|
|
@topic.last_poster = @new_owner
|
|
end
|
|
|
|
@topic.update_statistics
|
|
|
|
@new_owner.user_stat.update(
|
|
first_post_created_at: @new_owner.reload.posts.order('created_at ASC').first&.created_at
|
|
)
|
|
|
|
@topic.save!(validate: false)
|
|
end
|
|
end
|
|
end
|