forked from e621ng/e621ng
[UserFeedbacks] Restore deleted user feedbacks from staff notes (#859)
This commit is contained in:
parent
5a2a4d438a
commit
8136799546
@ -38,9 +38,6 @@ class UserFeedback < ApplicationRecord
|
|||||||
|
|
||||||
def log_destroy
|
def log_destroy
|
||||||
ModAction.log(:user_feedback_destroy, { user_id: user_id, reason: body, type: category, record_id: id })
|
ModAction.log(:user_feedback_destroy, { user_id: user_id, reason: body, type: category, record_id: id })
|
||||||
deletion_user = "\"#{CurrentUser.name}\":/users/#{CurrentUser.id}"
|
|
||||||
creator_user = "\"#{creator.name}\":/users/#{creator.id}"
|
|
||||||
StaffNote.create(body: "#{deletion_user} deleted #{category} feedback, created #{created_at.to_date} by #{creator_user}: #{body}", user_id: user_id, creator: User.system)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
56
db/fixes/123_convert_staffnote_to_deleted_feedback.rb
Executable file
56
db/fixes/123_convert_staffnote_to_deleted_feedback.rb
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "config", "environment"))
|
||||||
|
|
||||||
|
destroyed_feedback_ids = []
|
||||||
|
|
||||||
|
CurrentUser.as_system do
|
||||||
|
ModAction.where(action: "user_feedback_destroy")
|
||||||
|
# On July 24, 2024, we deployed the ability to soft-delete feedback records.
|
||||||
|
# We only care about restoring destroyed feedbacks that were destroyed before this date.
|
||||||
|
# Any entries after this are "real" destructions, that do not need to be restored.
|
||||||
|
.where("created_at < ?", CUTOFF_DATE = Date.new(2024, 8, 1))
|
||||||
|
.find_in_batches(batch_size: 10_000) do |batch|
|
||||||
|
feedback_data = batch.map do |mod_action|
|
||||||
|
record_id = mod_action.values["record_id"].to_i
|
||||||
|
destroyed_feedback_ids << record_id
|
||||||
|
|
||||||
|
{
|
||||||
|
id: record_id,
|
||||||
|
user_id: mod_action.values["user_id"].to_i,
|
||||||
|
creator_id: User.system.id, # placeholder
|
||||||
|
category: mod_action.values["type"],
|
||||||
|
body: mod_action.values["reason"]&.strip,
|
||||||
|
created_at: Date.new(1970, 1, 1), # placeholder
|
||||||
|
updated_at: mod_action.created_at,
|
||||||
|
updater_id: mod_action.creator_id,
|
||||||
|
is_deleted: true,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
UserFeedback.insert_all(feedback_data) if feedback_data.any?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
CurrentUser.as_system do
|
||||||
|
ModAction.where(action: "user_feedback_create")
|
||||||
|
.where("values->>'record_id' IN (?)", destroyed_feedback_ids.map(&:to_s))
|
||||||
|
.find_in_batches(batch_size: 10_000) do |batch|
|
||||||
|
batch.each do |mod_action|
|
||||||
|
record_id = mod_action.values["record_id"].to_i
|
||||||
|
next unless destroyed_feedback_ids.include?(record_id)
|
||||||
|
|
||||||
|
UserFeedback.where(id: record_id).update_all(
|
||||||
|
creator_id: mod_action.creator_id,
|
||||||
|
created_at: mod_action.created_at,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
StaffNote.where(creator: User.system)
|
||||||
|
.where("body LIKE ?", "%deleted%feedback%")
|
||||||
|
.find_in_batches(batch_size: 10_000) do |batch|
|
||||||
|
StaffNote.where(id: batch.map(&:id)).delete_all
|
||||||
|
end
|
@ -93,7 +93,7 @@ class UserFeedbacksControllerTest < ActionDispatch::IntegrationTest
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "delete a feedback" do
|
should "delete a feedback" do
|
||||||
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 2 }) do
|
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 1 }) do
|
||||||
delete_auth user_feedback_path(@user_feedback), @critic
|
delete_auth user_feedback_path(@user_feedback), @critic
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -101,7 +101,7 @@ class UserFeedbacksControllerTest < ActionDispatch::IntegrationTest
|
|||||||
context "by a moderator" do
|
context "by a moderator" do
|
||||||
should "allow destroying feedbacks they created" do
|
should "allow destroying feedbacks they created" do
|
||||||
as(@mod) { @user_feedback = create(:user_feedback, user: @user) }
|
as(@mod) { @user_feedback = create(:user_feedback, user: @user) }
|
||||||
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 2 }) do
|
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 1 }) do
|
||||||
delete_auth user_feedback_path(@user_feedback), @mod
|
delete_auth user_feedback_path(@user_feedback), @mod
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -126,13 +126,13 @@ class UserFeedbacksControllerTest < ActionDispatch::IntegrationTest
|
|||||||
context "by an admin" do
|
context "by an admin" do
|
||||||
should "allow destroying feedbacks they created" do
|
should "allow destroying feedbacks they created" do
|
||||||
as(@admin) { @user_feedback = create(:user_feedback, user: @user) }
|
as(@admin) { @user_feedback = create(:user_feedback, user: @user) }
|
||||||
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 2 }) do
|
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 1 }) do
|
||||||
delete_auth user_feedback_path(@user_feedback), @admin
|
delete_auth user_feedback_path(@user_feedback), @admin
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
should "allow destroying feedbacks they did not create" do
|
should "allow destroying feedbacks they did not create" do
|
||||||
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 2 }) do
|
assert_difference({ "UserFeedback.count" => -1, "ModAction.count" => 1 }) do
|
||||||
delete_auth user_feedback_path(@user_feedback, format: :json), @admin
|
delete_auth user_feedback_path(@user_feedback, format: :json), @admin
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user