Sha256: 6b441efb2946e22697d439f46283577dd447e0233afe27b91af8c35b4ca638e9

Contents?: true

Size: 1.8 KB

Versions: 6

Compression:

Stored size: 1.8 KB

Contents

module Attachable
  class ApiClientNotPresent < StandardError; end

  def self.asset_api_client
    @asset_api_client
  end

  def self.asset_api_client=(api_client)
    @asset_api_client = api_client
  end

  module ClassMethods
    def attaches(*fields)
      fields.map(&:to_s).each do |field|
        before_save "upload_#{field}".to_sym, :if => "#{field}_has_changed?".to_sym
        self.field "#{field}_id".to_sym, type: String

        define_method(field) do
          raise ApiClientNotPresent unless Attachable.asset_api_client
          unless self.send("#{field}_id").nil?
            @attachments ||= { }
            @attachments[field] ||= Attachable.asset_api_client.asset(self.send("#{field}_id"))
          end
        end

        define_method("#{field}=") do |file|
          instance_variable_set("@#{field}_has_changed", true)
          instance_variable_set("@#{field}_file", file)
        end

        define_method("#{field}_has_changed?") do
          instance_variable_get("@#{field}_has_changed")
        end

        define_method("remove_#{field}=") do |value|
          unless value.nil? or value == false or (value.respond_to?(:empty?) and value.empty?)
            self.send("#{field}_id=", nil)
          end
        end

        define_method("upload_#{field}") do
          raise ApiClientNotPresent unless Attachable.asset_api_client
          begin
            response = Attachable.asset_api_client.create_asset(:file => instance_variable_get("@#{field}_file"))
            self.send("#{field}_id=", response.id.match(/\/([^\/]+)\z/) {|m| m[1] })
          rescue StandardError
            errors.add("#{field}_id".to_sym, "could not be uploaded")
          end
        end
        private "upload_#{field}".to_sym
      end
    end
  end

  def self.included(klass)
    klass.extend ClassMethods
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
govuk_content_models-8.9.0 app/traits/attachable.rb
govuk_content_models-8.8.0 app/traits/attachable.rb
govuk_content_models-8.7.0 app/traits/attachable.rb
govuk_content_models-8.6.0 app/traits/attachable.rb
govuk_content_models-8.5.0 app/traits/attachable.rb
govuk_content_models-8.4.1 app/traits/attachable.rb