master
 1class Photo < ApplicationRecord
 2  belongs_to :imageable, polymorphic: true, counter_cache: true, touch: true, optional: true
 3  scope :processed, ->{ where(image_processing: nil) }
 4
 5  def url_for(version_key, asset_host = ENV['ASSET_HOST'])
 6    version(version_key).url_for(asset_host)
 7  end
 8
 9  def is_processed?
10    !self.image_processing
11  end
12
13  def upload(file, blob_storage)
14    image = Image.new(file)
15    self.original_filename = File.basename(file)
16    self.image = image.filename
17    self.content_type = image.content_type
18    self.latitude, self.longitude = image.geolocation
19    self.image_processing = nil
20    self.sha256 = image.sha256
21    versions.each do |version|
22      version.adjust(image)
23      blob_storage.upload(version.blob_key, image.path)
24    end
25  end
26
27  def version(key)
28    versions.detect { |version| version.for?(key) }
29  end
30
31  private
32
33  def versions
34    @versions ||= [OriginalVersion.new(self), LargeVersion.new(self), ThumbnailVersion.new(self)]
35  end
36end