FIX: Onceoff job to recover missing post uploads.

FIX: Onceoff job to recover missing post uploads.

This fixes the regression due to PERF: Add fast path to find uploads before resorting to `LIKE` query. · discourse/discourse@1f636c4 · GitHub

diff --git a/app/jobs/onceoff/recover_post_uploads.rb b/app/jobs/onceoff/recover_post_uploads.rb
new file mode 100644
index 0000000..ef3fb0b
--- /dev/null
+++ b/app/jobs/onceoff/recover_post_uploads.rb
@@ -0,0 +1,22 @@
+require_dependency "upload_recovery"
+
+module Jobs
+  class RecoverPostUploads < Jobs::Onceoff
+    MIN_PERIOD = 30
+    MAX_PERIOD = 120
+
+    def execute_onceoff(args)
+      UploadRecovery.new.recover(Post.where(
+        "baked_at >= ?",
+        grace_period.days.ago
+      ))
+    end
+
+    def grace_period
+      SiteSetting.purge_deleted_uploads_grace_period_days.clamp(
+        MIN_PERIOD,
+        MAX_PERIOD
+      )
+    end
+  end
+end
diff --git a/spec/jobs/recover_post_uploads_spec.rb b/spec/jobs/recover_post_uploads_spec.rb
new file mode 100644
index 0000000..0448bc9
--- /dev/null
+++ b/spec/jobs/recover_post_uploads_spec.rb
@@ -0,0 +1,17 @@
+require 'rails_helper'
+
+RSpec.describe Jobs::RecoverPostUploads do
+  describe '#grace_period' do
+    it 'should restrict the grace period to the right range' do
+      SiteSetting.purge_deleted_uploads_grace_period_days =
+        described_class::MIN_PERIOD - 1
+
+      expect(described_class.new.grace_period).to eq(30)
+
+      SiteSetting.purge_deleted_uploads_grace_period_days =
+        described_class::MAX_PERIOD + 1
+
+      expect(described_class.new.grace_period).to eq(120)
+    end
+  end
+end

GitHub sha: 8a171389e1a36888eaa6f20d65507ff184a1f78a

This commit has been mentioned on Discourse Meta. There might be relevant details there: