Files
danbooru/app/logical/storage_manager/match.rb
2019-12-22 21:23:37 -06:00

110 lines
3.0 KiB
Ruby

#
# Generalizes the hybrid storage manager to be more declarative in
# syntax. Matches are executed in order of appearance so the first
# matching manager is returned. You should always add at least one
# manager with no constraints as a default case.
#
### Example
#
# StorageManager::Match.new do |matcher|
# matcher.add_manager(type: :crop) do
# StorageManager::SFTP.new("raikou3.donmai.us", base_url: "https://raikou3.donmai.us", hierarchical: true, base_dir: "/var/www/raikou3")
# end
#
# matcher.add_manager(id: 1..850_000) do
# StorageManager::SFTP.new("raikou1.donmai.us", base_url: "https://raikou1.donmai.us", hierarchical: true, base_dir: "/var/www/raikou1")
# end
#
# matcher.add_manager(id: 850_001..2_000_000) do
# StorageManager::SFTP.new("raikou2.donmai.us", base_url: "https://raikou2.donmai.us", hierarchical: true, base_dir: "/var/www/raikou2")
# end
#
# matcher.add_manager(id: 1..3_000_000, type: [:large, :original]) do
# StorageManager::SFTP.new(*Danbooru.config.all_server_hosts, base_url: "https://hijiribe.donmai.us/data")
# end
#
# matcher.add_manager({}) do
# StorageManager::SFTP.new(*Danbooru.config.all_server_hosts, base_url: "#{CurrentUser.root_url}/data")
# end
# end
#
class StorageManager::Match < StorageManager
def initialize
@managers = []
yield self if block_given?
end
def add_manager(constraints)
manager = yield
@managers << [constraints, manager]
end
def find(params)
@managers.each do |constraints, manager|
match = true
if params[:id] && constraints[:id] && !constraints[:id].include?(params[:id].to_i)
match = false
end
if constraints[:id] && !params[:id]
match = false
end
if params[:type] && constraints[:type]
if constraints[:type].respond_to?(:include?)
if !constraints[:type].include?(params[:type])
match = false
end
elsif constraints[:type] != params[:type]
match = false
end
end
if constraints[:type] && !params[:type]
match = false
end
if match
if block_given?
return yield(manager)
else
return manager
end
end
end
end
def store_file(io, post, type)
find(id: post.id, type: type) do |manager|
manager.store_file(io, post, type)
end
end
def delete_file(post_id, md5, file_ext, type)
find(id: post_id, type: type) do |manager|
manager.delete_file(post_id, md5, file_ext, type)
end
end
def open_file(post, type)
find(id: post.id, type: type) do |manager|
manager.open_file(post, type)
end
end
def file_url(post, type, **options)
find(id: post.id, type: type) do |manager|
manager.file_url(post, type, **options)
end
end
def file_path(post, file_ext, type, **options)
find(id: post.id, type: type) do |manager|
manager.file_path(post, file_ext, type, **options)
end
end
end