diff --git a/app/models/post.rb b/app/models/post.rb index 34c769f39..960e58831 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -67,9 +67,11 @@ class Post < ApplicationRecord module ClassMethods def delete_files(post_id, file_path, large_file_path, preview_file_path, force: false) unless force - post = Post.find(post_id) + # XXX should pass in the md5 instead of parsing it. + preview_file_path =~ %r!/data/preview/(?:test\.)?([a-z0-9]{32})\.jpg\z! + md5 = $1 - if post.file_path == file_path || post.large_file_path == large_file_path || post.preview_file_path == preview_file_path + if Post.where(md5: md5).exists? raise DeletionError.new("Files still in use; skipping deletion.") end end diff --git a/test/unit/post_replacement_test.rb b/test/unit/post_replacement_test.rb index 5aaae9186..3fe223943 100644 --- a/test/unit/post_replacement_test.rb +++ b/test/unit/post_replacement_test.rb @@ -202,6 +202,27 @@ class PostReplacementTest < ActiveSupport::TestCase end end + context "two posts that have had their files swapped" do + should "not delete the still active files" do + @post1 = FactoryGirl.create(:post) + @post2 = FactoryGirl.create(:post) + + # swap the images between @post1 and @post2. + @post1.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247350") + @post2.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364") + @post2.replace!(replacement_url: "https://www.google.com/intl/en_ALL/images/logo.gif") + @post1.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364") + @post2.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247350") + + Timecop.travel(Time.now + PostReplacement::DELETION_GRACE_PERIOD + 1.day) do + Delayed::Worker.new.work_off + end + + assert(File.exists?(@post1.file_path)) + assert(File.exists?(@post2.file_path)) + end + end + context "a post with an uploaded file" do should "work" do upload_file("#{Rails.root}/test/files/test.png", "test.png") do |file|