module S3FF::ModelHelper

Public Instance Methods

download_from_direct_url_with_delay(attr_name, nil_direct_url_after_save: false) click to toggle source
# File lib/s3ff/model_helper.rb, line 3
    def download_from_direct_url_with_delay(attr_name, nil_direct_url_after_save: false)
      if self.respond_to?(:delay)
        has_db_column = self.column_names.include?("#{attr_name}_direct_url") rescue false

        if has_db_column
          self.class_eval <<-EOM

            after_save :delay_s3ff_download_direct_url, if: -> { #{attr_name}_direct_url.present? && #{attr_name}_direct_url_changed? }

          EOM
        else
          self.class_eval <<-EOM

            def #{attr_name}_direct_url
              @#{attr_name}_direct_url
            end

            def #{attr_name}_direct_url=(val)
              #{"return if val.blank?" if nil_direct_url_after_save}
              self.updated_at = Time.now if val != @#{attr_name}_direct_url
              @#{attr_name}_direct_url = val
            end

            after_save :delay_s3ff_download_direct_url, if: proc { #{attr_name}_direct_url.present? }

          EOM
        end

        self.class_eval <<-EOM

          def delay_s3ff_download_direct_url
            self.class.delay.s3ff_download_direct_url(id, #{attr_name}_direct_url)
          end

          def self.s3ff_download_direct_url(instance_id, #{attr_name}_direct_url)
            open(#{attr_name}_direct_url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE) do |file|
              find(instance_id).update(
                #{attr_name}: file,
                #{attr_name}_file_name: File.basename(#{attr_name}_direct_url),
                #{"#{attr_name}_direct_url: nil," if nil_direct_url_after_save}
              )
            end
          end
        EOM
      elsif self.respond_to?(:handle_asynchronously)

        # handle_asynchronously requires db column anyways
        self.class_eval <<-EOM
          after_save :s3ff_download_direct_url, if: -> { #{attr_name}_direct_url.present? && #{attr_name}_direct_url_changed? }

          def s3ff_download_direct_url
            open(#{attr_name}_direct_url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE) do |file|
              update(
                #{attr_name}: file,
                #{attr_name}_file_name: File.basename(#{attr_name}_direct_url),
                #{"#{attr_name}_direct_url: nil," if nil_direct_url_after_save}
              )
            end
          end

          handle_asynchronously :s3ff_download_direct_url
        EOM
      else
        raise NotImplementedError('download_from_direct_url_with_delay only supports delayed_job or sidekiq delayed extension')
      end
    end