aboutsummaryrefslogtreecommitdiffstats
path: root/lib/active_storage/service
diff options
context:
space:
mode:
Diffstat (limited to 'lib/active_storage/service')
-rw-r--r--lib/active_storage/service/configurator.rb31
-rw-r--r--lib/active_storage/service/mirror_service.rb11
2 files changed, 42 insertions, 0 deletions
diff --git a/lib/active_storage/service/configurator.rb b/lib/active_storage/service/configurator.rb
new file mode 100644
index 0000000000..5054e07ec7
--- /dev/null
+++ b/lib/active_storage/service/configurator.rb
@@ -0,0 +1,31 @@
+class ActiveStorage::Service::Configurator #:nodoc:
+ def initialize(service_name, configurations)
+ @service_name, @configurations = service_name.to_sym, configurations.symbolize_keys
+ end
+
+ def build
+ service_class.build(service_config.except(:service), @configurations)
+ end
+
+ private
+ def service_class
+ resolve service_class_name
+ end
+
+ def service_class_name
+ service_config.fetch :service do
+ raise "Missing Active Storage `service: …` configuration for #{service_config.inspect}"
+ end
+ end
+
+ def service_config
+ @configurations.fetch @service_name do
+ raise "Missing configuration for the #{@service_name.inspect} Active Storage service. Configurations available for #{@configurations.keys.inspect}"
+ end
+ end
+
+ def resolve(service_class_name)
+ require "active_storage/service/#{service_class_name.to_s.downcase}_service"
+ ActiveStorage::Service.const_get(:"#{service_class_name}Service")
+ end
+end
diff --git a/lib/active_storage/service/mirror_service.rb b/lib/active_storage/service/mirror_service.rb
index 7ec166aace..eec1f2af65 100644
--- a/lib/active_storage/service/mirror_service.rb
+++ b/lib/active_storage/service/mirror_service.rb
@@ -5,6 +5,17 @@ class ActiveStorage::Service::MirrorService < ActiveStorage::Service
delegate :download, :exist?, :url, to: :primary
+ # Stitch together from named configuration.
+ def self.build(mirror_config, all_configurations) #:nodoc:
+ primary = ActiveStorage::Service.configure(mirror_config.fetch(:primary), all_configurations)
+
+ mirrors = mirror_config.fetch(:mirrors).collect do |service_name|
+ ActiveStorage::Service.configure(service_name.to_sym, all_configurations)
+ end
+
+ new primary: primary, mirrors: mirrors
+ end
+
def initialize(primary:, mirrors:)
@primary, @mirrors = primary, mirrors
end