iagopiimenta/activestorage_legacy

View on GitHub
lib/active_storage/engine.rb

Summary

Maintainability
A
0 mins
Test Coverage
C
71%
require "rails/engine"

module ActiveStorage
  class Engine < Rails::Engine # :nodoc:
    config.active_storage = ActiveSupport::OrderedOptions.new

    # config.eager_load_namespaces << ActiveStorage

    initializer "active_storage.logger" do
      require "active_storage/service"

      config.after_initialize do |app|
        ActiveStorage::Service.logger = app.config.active_storage.logger || Rails.logger
      end
    end

    initializer 'active_storage.extend_active_record' do
      require "active_storage/patches"
      require "active_storage/patches/active_record"

      ActiveSupport.on_load :active_record do
        extend ActiveStorage::Patches::ActiveRecord
      end
    end

    initializer "active_storage.attached" do
      require "active_storage/attached"

      ActiveSupport.on_load(:active_record) do
        extend ActiveStorage::Attached::Macros
      end
    end

    # Port of Rails.application.key_generator.generate_key('ActiveStorage')
    #   Used to sign ActiveStorage::Blob
    # See: https://github.com/rails/activestorage/blob/archive/lib/active_storage/engine.rb#L27
    # https://github.com/rails/rails/blob/7-0-stable/activesupport/lib/active_support/key_generator.rb#L40
    initializer "active_storage.verifier" do
      require 'active_storage/verifier'

      config.after_initialize do |app|
        key = OpenSSL::PKCS5.pbkdf2_hmac(
          app.config.secret_token,
          'ActiveStorage',
          1000,
          64,
          OpenSSL::Digest::SHA256.new
        )
        ActiveStorage.verifier = ActiveStorage::Verifier.new(key)
      end
    end

    initializer "active_storage.services" do
      config.after_initialize do |app|
        if config_choice = app.config.active_storage.service
          config_file = Pathname.new(Rails.root.join("config/storage_services.yml"))
          raise("Couldn't find Active Storage configuration in #{config_file}") unless config_file.exist?

          require "yaml"
          require "erb"

          configs =
            begin
              YAML.load(ERB.new(config_file.read).result) || {}
            rescue Psych::SyntaxError => e
              raise "YAML syntax error occurred while parsing #{config_file}. " \
                    "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
                    "Error: #{e.message}"
            end

          ActiveStorage::Blob.service =
            begin
              ActiveStorage::Service.configure config_choice, configs
            rescue => e
              raise e, "Cannot load `Rails.config.active_storage.service`:\n#{e.message}", e.backtrace
            end
        end
      end
    end
  end
end