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)
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
|