From 060762defad857162d4b9d59764bcbe21a34d93f Mon Sep 17 00:00:00 2001 From: r888888888 Date: Wed, 22 Nov 2017 13:19:30 -0800 Subject: [PATCH] add service for purging files from cloudflare cache --- app/logical/cloudflare_service.rb | 36 ++++++++++++++++++++++++++++ app/models/post.rb | 5 ++++ test/unit/cloudflare_service_test.rb | 27 +++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 app/logical/cloudflare_service.rb create mode 100644 test/unit/cloudflare_service_test.rb diff --git a/app/logical/cloudflare_service.rb b/app/logical/cloudflare_service.rb new file mode 100644 index 000000000..206a07b0e --- /dev/null +++ b/app/logical/cloudflare_service.rb @@ -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 diff --git a/app/models/post.rb b/app/models/post.rb index 31ec0f1c1..1a25add2e 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -89,6 +89,11 @@ class Post < ApplicationRecord RemoteFileManager.new(file_path).delete RemoteFileManager.new(large_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 diff --git a/test/unit/cloudflare_service_test.rb b/test/unit/cloudflare_service_test.rb new file mode 100644 index 000000000..ea74ac296 --- /dev/null +++ b/test/unit/cloudflare_service_test.rb @@ -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