posts: move expunged image to trash folder.

When a post is expunged, move the image to a trash folder so it can be
recovered if needed.
This commit is contained in:
evazion
2022-05-03 04:40:47 -05:00
parent c07b099bf8
commit ac98c142a4
4 changed files with 45 additions and 15 deletions

View File

@@ -50,6 +50,24 @@ class StorageManager
raise NotImplementedError, "open not implemented"
end
# Copy the file from src_path to dest_path.
#
# @param src_path [String] The file to copy.
# @param dest_path [String] The location to copy the file to.
def copy(src_path, dest_path)
file = open(src_path)
store(file, dest_path)
end
# Move the file from src_path to dest_path.
#
# @param src_path [String] The file to move.
# @param dest_path [String] The location to move the file to.
def move(src_path, dest_path)
copy(src_path, dest_path)
delete(src_path)
end
# Return the full URL of the file at the given path, or nil if the file
# doesn't have an URL.
# @return [String, nil] the file URL

View File

@@ -24,8 +24,7 @@ class MediaAsset < ApplicationRecord
# Processing: The asset's files are currently being resized and distributed to the backend servers.
# Active: The asset has been successfully uploaded and is ready to use.
# Deleted: The asset's files have been deleted by moving them to a trash folder. They can be undeleted
# by moving them out of the trash folder. (Not implemented yet).
# Deleted: The asset's files have been deleted by moving them to a trash folder. They can be undeleted by moving them out of the trash folder.
# Expunged: The asset's files have been permanently deleted.
# Failed: The asset failed to upload. The asset may be in a partially uploaded state, with some
# files missing or incompletely transferred.
@@ -62,6 +61,11 @@ class MediaAsset < ApplicationRecord
backup_storage_service.store(file, file_path)
end
def trash_file!
storage_service.move(file_path, "/trash/#{file_path}")
backup_storage_service.move(file_path, "/trash/#{file_path}")
end
def delete_file!
storage_service.delete(file_path)
backup_storage_service.delete(file_path)
@@ -276,6 +280,14 @@ class MediaAsset < ApplicationRecord
raise
end
def trash!
variants.each(&:trash_file!)
update!(status: :deleted)
rescue
update!(status: :failed)
raise
end
def delete_files!
variants.each(&:delete_file!)
end

View File

@@ -756,7 +756,7 @@ class Post < ApplicationRecord
decrement_tag_post_counts
remove_from_all_pools
remove_from_fav_groups
media_asset.expunge!
media_asset.trash!
destroy
update_parent_on_destroy
end

View File

@@ -46,10 +46,10 @@ class PostTest < ActiveSupport::TestCase
assert_raise(StandardError) { @post.file(:original) }
end
should "mark the media asset as expunged" do
should "mark the media asset as deleted" do
@post.expunge!
assert_equal("expunged", @post.media_asset.status)
assert_equal("deleted", @post.media_asset.status)
end
should "remove all favorites" do
@@ -199,16 +199,16 @@ class PostTest < ActiveSupport::TestCase
context "Expunging a post with" do
context "a parent" do
should "reset the has_children flag of the parent" do
p1 = FactoryBot.create(:post)
c1 = FactoryBot.create(:post, :parent_id => p1.id)
p1 = create(:post)
c1 = create(:post_with_file, parent_id: p1.id)
c1.expunge!
p1.reload
assert_equal(false, p1.has_children?)
end
should "update the parent's has_children flag" do
p1 = FactoryBot.create(:post)
c1 = FactoryBot.create(:post, :parent_id => p1.id)
p1 = create(:post)
c1 = create(:post_with_file, parent_id: p1.id)
c1.expunge!
p1.reload
assert(!p1.has_children?, "Parent should not have children")
@@ -217,8 +217,8 @@ class PostTest < ActiveSupport::TestCase
context "one child" do
should "remove the parent of that child" do
p1 = FactoryBot.create(:post)
c1 = FactoryBot.create(:post, :parent_id => p1.id)
p1 = create(:post_with_file)
c1 = create(:post, parent_id: p1.id)
p1.expunge!
c1.reload
assert_nil(c1.parent)
@@ -229,10 +229,10 @@ class PostTest < ActiveSupport::TestCase
setup do
# ensure initial post versions won't be merged.
travel_to(1.day.ago) do
@p1 = FactoryBot.create(:post)
@c1 = FactoryBot.create(:post, :parent_id => @p1.id)
@c2 = FactoryBot.create(:post, :parent_id => @p1.id)
@c3 = FactoryBot.create(:post, :parent_id => @p1.id)
@p1 = create(:post_with_file)
@c1 = create(:post, parent_id: @p1.id)
@c2 = create(:post, parent_id: @p1.id)
@c3 = create(:post, parent_id: @p1.id)
end
end