add service for purging files from cloudflare cache
This commit is contained in:
36
app/logical/cloudflare_service.rb
Normal file
36
app/logical/cloudflare_service.rb
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
class CloudflareService
|
||||||
|
def key
|
||||||
|
Danbooru.config.cloudflare_key
|
||||||
|
end
|
||||||
|
|
||||||
|
def email
|
||||||
|
Danbooru.config.cloudflare_email
|
||||||
|
end
|
||||||
|
|
||||||
|
def zone
|
||||||
|
Danbooru.config.cloudflare_zone
|
||||||
|
end
|
||||||
|
|
||||||
|
def options
|
||||||
|
Danbooru.config.httparty_options.deep_merge(headers: {
|
||||||
|
"X-Auth-Email" => email,
|
||||||
|
"X-Auth-Key" => key,
|
||||||
|
"Content-Type" => "application/json",
|
||||||
|
"User-Agent" => "#{Danbooru.config.app_name}/#{Danbooru.config.version}"
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(md5, ext)
|
||||||
|
url = "https://api.cloudflare.com/client/v4/zones/#{zone}/purge_cache"
|
||||||
|
files = ["#{md5}.#{ext}", "preview/#{md5}.jpg", "sample/sample-#{md5}.jpg"].map do |name|
|
||||||
|
["danbooru", "safebooru"].map do |subdomain|
|
||||||
|
"http://#{subdomain}.donmai.us/data/#{name}"
|
||||||
|
end
|
||||||
|
end.flatten
|
||||||
|
body = {
|
||||||
|
"files" => files
|
||||||
|
}.to_json
|
||||||
|
|
||||||
|
HTTParty.delete(url, options.merge(body: body)) #, body: body)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -89,6 +89,11 @@ class Post < ApplicationRecord
|
|||||||
RemoteFileManager.new(file_path).delete
|
RemoteFileManager.new(file_path).delete
|
||||||
RemoteFileManager.new(large_file_path).delete
|
RemoteFileManager.new(large_file_path).delete
|
||||||
RemoteFileManager.new(preview_file_path).delete
|
RemoteFileManager.new(preview_file_path).delete
|
||||||
|
|
||||||
|
if Danbooru.config.cloudflare_key
|
||||||
|
md5, ext = File.basename(file_path).split(".")
|
||||||
|
CloudflareService.new.delete(md5, ext)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
27
test/unit/cloudflare_service_test.rb
Normal file
27
test/unit/cloudflare_service_test.rb
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
require 'webmock/minitest'
|
||||||
|
|
||||||
|
class CloudflareServiceTest < ActiveSupport::TestCase
|
||||||
|
def setup
|
||||||
|
super
|
||||||
|
|
||||||
|
Danbooru.config.stubs(:cloudflare_key).returns("xyz")
|
||||||
|
Danbooru.config.stubs(:cloudflare_email).returns("abc")
|
||||||
|
Danbooru.config.stubs(:cloudflare_zone).returns("123")
|
||||||
|
end
|
||||||
|
|
||||||
|
subject { CloudflareService.new }
|
||||||
|
|
||||||
|
context "#delete" do
|
||||||
|
setup do
|
||||||
|
stub_request(:any, "api.cloudflare.com")
|
||||||
|
end
|
||||||
|
|
||||||
|
should "make calls to cloudflare's api" do
|
||||||
|
subject.delete("md5", "png")
|
||||||
|
assert_requested(:delete, "https://api.cloudflare.com/client/v4/zones/123/purge_cache", times: 1) do |req|
|
||||||
|
req.body =~ /danbooru\.donmai\.us/ && req.body =~ /safebooru\.donmai\.us/ && req.body =~ /sample/ && req.body =~ /preview/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user