diff --git a/app/controllers/post_regenerations_controller.rb b/app/controllers/post_regenerations_controller.rb
index 1d5b60244..d465ac3f8 100644
--- a/app/controllers/post_regenerations_controller.rb
+++ b/app/controllers/post_regenerations_controller.rb
@@ -1,9 +1,10 @@
class PostRegenerationsController < ApplicationController
- respond_to :xml, :json, :js
+ respond_to :xml, :json, :html
def create
@post = authorize Post.find(params[:post_id]), :regenerate?
- @post.regenerate!(params[:category], CurrentUser.user)
+ @post.regenerate_later!(params[:category], CurrentUser.user)
+ flash[:notice] = "Post regeneration scheduled, press Ctrl+F5 in a few seconds to refresh the image"
respond_with(@post)
end
diff --git a/app/jobs/regenerate_post_job.rb b/app/jobs/regenerate_post_job.rb
new file mode 100644
index 000000000..f9905d935
--- /dev/null
+++ b/app/jobs/regenerate_post_job.rb
@@ -0,0 +1,8 @@
+class RegeneratePostJob < ApplicationJob
+ queue_as :default
+ queue_with_priority 20
+
+ def perform(post:, category:, user:)
+ post.regenerate!(category, user)
+ end
+end
diff --git a/app/models/post.rb b/app/models/post.rb
index 1a67e0a64..d3a3df27e 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -1326,6 +1326,10 @@ class Post < ApplicationRecord
end
concerning :RegenerationMethods do
+ def regenerate_later!(category, user)
+ RegeneratePostJob.perform_later(post: self, category: category, user: user)
+ end
+
def regenerate!(category, user)
if category == "iqdb"
update_iqdb_async
diff --git a/app/views/post_regenerations/create.js.erb b/app/views/post_regenerations/create.js.erb
deleted file mode 100644
index c891928ae..000000000
--- a/app/views/post_regenerations/create.js.erb
+++ /dev/null
@@ -1 +0,0 @@
-Danbooru.notice("Post regenerated");
diff --git a/app/views/posts/partials/show/_options.html.erb b/app/views/posts/partials/show/_options.html.erb
index 852a55205..17c4df489 100644
--- a/app/views/posts/partials/show/_options.html.erb
+++ b/app/views/posts/partials/show/_options.html.erb
@@ -88,6 +88,6 @@
<% end %>
<% if policy(post).regenerate? %>
-
<%= link_to "Regenerate image", post_regenerations_path(post_id: post.id, category: "resizes"), remote: true, method: :post, "data-confirm": "This will regenerate the posts's thumbnail images. Are you sure?" %>
+ <%= link_to "Regenerate image", post_regenerations_path(post_id: post.id, category: "resizes"), method: :post, "data-confirm": "This will regenerate the posts's thumbnail images. Are you sure?" %>
<% end %>
diff --git a/test/functional/post_regenerations_controller_test.rb b/test/functional/post_regenerations_controller_test.rb
index b02e9efdd..1b546d186 100644
--- a/test/functional/post_regenerations_controller_test.rb
+++ b/test/functional/post_regenerations_controller_test.rb
@@ -4,21 +4,63 @@ class PostRegenerationsControllerTest < ActionDispatch::IntegrationTest
context "The post regenerations controller" do
setup do
@mod = create(:moderator_user, name: "yukari", created_at: 1.month.ago)
- as(@mod) do
- @post = create(:post, source: "https://google.com", tag_string: "touhou")
- end
+ @upload = assert_successful_upload("test/files/test.jpg", user: @mod)
+ @post = @upload.post
end
context "create action" do
should "render" do
post_auth post_regenerations_path, @mod, params: { post_id: @post.id, category: "iqdb" }
- assert_response :success
+
+ assert_redirected_to @post
+ assert_enqueued_jobs(1, only: RegeneratePostJob)
end
should "not allow non-mods to regenerate posts" do
post_auth post_regenerations_path, create(:user), params: { post_id: @post.id, category: "iqdb" }
assert_response 403
end
+
+ context "for an IQDB regeneration" do
+ should "regenerate IQDB" do
+ mock_iqdb_service!
+ Post.iqdb_sqs_service.expects(:send_message).with("update\n#{@post.id}\n#{@post.preview_file_url}")
+
+ post_auth post_regenerations_path, @mod, params: { post_id: @post.id, category: "iqdb" }
+ perform_enqueued_jobs
+ end
+
+ should "log a mod action" do
+ post_auth post_regenerations_path, @mod, params: { post_id: @post.id, category: "iqdb" }
+ perform_enqueued_jobs
+
+ assert_equal(@mod, ModAction.last.creator)
+ assert_equal("post_regenerate_iqdb", ModAction.last.category)
+ assert_equal("@#{@mod.name} regenerated IQDB for post ##{@post.id}", ModAction.last.description)
+ end
+ end
+
+ context "for an image sample regeneration" do
+ should "regenerate missing thumbnails" do
+ @preview_file_size = @post.file(:preview).size
+ @post.storage_manager.delete_file(@post.id, @post.md5, @post.file_ext, :preview)
+ assert_raise(Errno::ENOENT) { @post.file(:preview) }
+
+ post_auth post_regenerations_path, @mod, params: { post_id: @post.id }
+ perform_enqueued_jobs
+
+ assert_equal(@preview_file_size, @post.file(:preview).size)
+ end
+
+ should "log a mod action" do
+ post_auth post_regenerations_path, @mod, params: { post_id: @post.id }
+ perform_enqueued_jobs
+
+ assert_equal(@mod, ModAction.last.creator)
+ assert_equal("post_regenerate", ModAction.last.category)
+ assert_equal("@#{@mod.name} regenerated image samples for post ##{@post.id}", ModAction.last.description)
+ end
+ end
end
end
end