Module: S3FF::ModelHelper

Defined in:
lib/s3ff/model_helper.rb

Instance Method Summary collapse

Instance Method Details

#download_from_direct_url_with_delay(attr_name, nil_direct_url_after_save: false) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 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