--- /dev/null
+# frozen_string_literal: true
+
+class CacheBuster
+ def initialize(options = {})
+ @secret_header = options[:secret_header] || 'Secret-Header'
+ @secret = options[:secret] || 'True'
+ end
+
+ def bust(url)
+ site = Addressable::URI.parse(url).normalized_site
+
+ request_pool.with(site) do |http_client|
+ build_request(url, http_client).perform
+ end
+ end
+
+ private
+
+ def request_pool
+ RequestPool.current
+ end
+
+ def build_request(url, http_client)
+ Request.new(:get, url, http_client: http_client).tap do |request|
+ request.add_headers(@secret_header => @secret)
+ end
+ end
+end
Rails.logger.warn "Tried to change permission on non-existent file #{attachment.path(style)}"
end
end
+
+ CacheBusterWorker.perform_async(attachment.path(style)) if Rails.configuration.x.cache_buster_enabled
end
end
end
Rails.logger.warn "Tried to change permission on non-existent file #{attachment.path(style)}"
end
end
+
+ CacheBusterWorker.perform_async(attachment.path(style)) if Rails.configuration.x.cache_buster_enabled
end
end
end
--- /dev/null
+# frozen_string_literal: true
+
+class CacheBusterWorker
+ include Sidekiq::Worker
+ include RoutingHelper
+
+ sidekiq_options queue: 'pull'
+
+ def perform(path)
+ cache_buster.bust(full_asset_url(path))
+ end
+
+ private
+
+ def cache_buster
+ CacheBuster.new(Rails.configuration.x.cache_buster)
+ end
+end
--- /dev/null
+# frozen_string_literal: true
+
+Rails.application.configure do
+ config.x.cache_buster_enabled = ENV['CACHE_BUSTER_ENABLED'] == 'true'
+
+ config.x.cache_buster = {
+ secret_header: ENV['CACHE_BUSTER_SECRET_HEADER'],
+ secret: ENV['CACHE_BUSTER_SECRET'],
+ }
+end
else
Paperclip::Attachment.default_options.merge!(
storage: :filesystem,
- use_timestamp: true,
path: File.join(ENV.fetch('PAPERCLIP_ROOT_PATH', File.join(':rails_root', 'public', 'system')), ':prefix_path:class', ':attachment', ':id_partition', ':style', ':filename'),
url: ENV.fetch('PAPERCLIP_ROOT_URL', '/system') + '/:prefix_url:class/:attachment/:id_partition/:style/:filename',
)