From ac98c142a4852ec9a4aeaab6384e4428cb4e33a7 Mon Sep 17 00:00:00 2001 From: evazion Date: Tue, 3 May 2022 04:40:47 -0500 Subject: [PATCH] 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. --- app/logical/storage_manager.rb | 18 ++++++++++++++++++ app/models/media_asset.rb | 16 ++++++++++++++-- app/models/post.rb | 2 +- test/unit/post_test.rb | 24 ++++++++++++------------ 4 files changed, 45 insertions(+), 15 deletions(-) diff --git a/app/logical/storage_manager.rb b/app/logical/storage_manager.rb index dac42c41c..562d8e57c 100644 --- a/app/logical/storage_manager.rb +++ b/app/logical/storage_manager.rb @@ -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 diff --git a/app/models/media_asset.rb b/app/models/media_asset.rb index 0859d586e..74b0cc824 100644 --- a/app/models/media_asset.rb +++ b/app/models/media_asset.rb @@ -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 diff --git a/app/models/post.rb b/app/models/post.rb index ad0612078..aa26d55f5 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -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 diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 2336e7c93..aee26bbd3 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -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