aboutsummaryrefslogtreecommitdiffstats
path: root/lib/active_storage/variant.rb
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2017-07-11 18:53:17 +0200
committerDavid Heinemeier Hansson <david@loudthinking.com>2017-07-11 18:53:17 +0200
commit1966c188cfb06b39a47082e2f6c6e33a43668ae5 (patch)
treeda96a28a10f331a38eb88a8b033f24bf38948d1e /lib/active_storage/variant.rb
parent9cf33478991b9fab663d5502342729b98eafa2bd (diff)
downloadrails-1966c188cfb06b39a47082e2f6c6e33a43668ae5.tar.gz
rails-1966c188cfb06b39a47082e2f6c6e33a43668ae5.tar.bz2
rails-1966c188cfb06b39a47082e2f6c6e33a43668ae5.zip
Very incomplete first stab
Diffstat (limited to 'lib/active_storage/variant.rb')
-rw-r--r--lib/active_storage/variant.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/active_storage/variant.rb b/lib/active_storage/variant.rb
new file mode 100644
index 0000000000..9b9dad43da
--- /dev/null
+++ b/lib/active_storage/variant.rb
@@ -0,0 +1,52 @@
+require "active_storage/blob"
+require "mini_magick"
+
+class ActiveStorage::Variant
+ class_attribute :verifier
+
+ attr_reader :blob, :variation
+ delegate :service, to: :blob
+
+ def self.lookup(blob_key:, variation_key:)
+ new ActiveStorage::Blob.find_by!(key: blob_key), variation: verifier.verify(variation_key)
+ end
+
+ def self.encode_key(variation)
+ verifier.generate(variation)
+ end
+
+ def initialize(blob, variation:)
+ @blob, @variation = blob, variation
+ end
+
+ def url(expires_in: 5.minutes, disposition: :inline)
+ perform unless exist?
+ service.url key, expires_in: expires_in, disposition: disposition, filename: blob.filename
+ end
+
+ def key
+ verifier.generate(variation)
+ end
+
+ private
+ def perform
+ upload_variant transform(download_blob)
+ end
+
+ def download_blob
+ service.download(blob.key)
+ end
+
+ def upload_variant(variation)
+ service.upload key, variation
+ end
+
+ def transform(io)
+ # FIXME: Actually do a variant based on the variation
+ File.open MiniMagick::Image.read(io).resize("500x500").path
+ end
+
+ def exist?
+ service.exist?(key)
+ end
+end