Commit 0e26bca0

mo khan <mo@mokhan.ca>
2014-09-21 03:59:42
update blob storage to be able to download files from s3.
1 parent 62a26c3
Changed files (5)
app
services
application
infrastructure
spec
services
infrastructure
app/services/application/handlers/process_avatar.rb
@@ -9,7 +9,7 @@ class ProcessAvatar
 
   def handle(message)
     user = User.find(message[:user_id])
-    user.avatar = Photo.create!(image_processing: true)
+    user.avatar = Photo.create!
     user.avatar.upload(message[:file_path], @blob_storage)
     user.avatar.save!
   end
app/services/infrastructure/blob_storage.rb
@@ -12,6 +12,16 @@ class BlobStorage
     object.acl = :public_read
   end
 
+  def download(key)
+    object = connection.buckets[bucket_name].objects[key]
+    File.open("#{Dir.tmpdir}/#{key}", "wb") do |tempfile|
+      object.read do |chunk|
+        tempfile.write(chunk)
+      end
+      yield tempfile
+    end
+  end
+
   private
 
   def connection
spec/services/infrastructure/blob_storage_spec.rb
@@ -4,9 +4,9 @@ describe BlobStorage do
   let(:bucket) { ENV['FOG_DIRECTORY'] }
   subject { BlobStorage.new }
 
-  context "when uploading" do
-    let(:file) { File.join(Rails.root, 'spec/fixtures/images/gps.jpg') }
+  let(:file) { File.join(Rails.root, 'spec/fixtures/images/gorilla.jpg') }
 
+  context "when uploading" do
     it "uploads to s3" do
       key = "test#{SecureRandom.uuid}"
       subject.upload(key, file)
@@ -15,4 +15,17 @@ describe BlobStorage do
       expect(object.exists?).to be_truthy
     end
   end
+
+  describe "#download" do
+    let(:key) { "test#{SecureRandom.uuid}" }
+
+    it 'downloads a file from blob storage' do
+      subject.upload(key, file)
+
+      sha = subject.download(key) do |temp_file|
+        Digest::SHA256.file(temp_file.path).hexdigest
+      end
+      expect(sha).to eql(Digest::SHA256.file(file).hexdigest)
+    end
+  end
 end
Gemfile
@@ -35,7 +35,7 @@ gem 'gibbon', '~> 1.1.2'
 gem 'twitter', '~> 5.9.0'
 gem 'spank'
 gem 'exifr', '~> 1.1.3'
-gem 'aws-sdk', '~> 1.42.0'
+gem 'aws-sdk'
 gem 'mime-types', '~> 1.25.1'
 gem 'ejs', '~> 1.1.1'
 gem 'js-routes', '~> 0.9.8'
Gemfile.lock
@@ -34,7 +34,9 @@ GEM
     asset_sync (1.0.0)
       activemodel
       fog (>= 1.8.0)
-    aws-sdk (1.42.0)
+    aws-sdk (1.53.0)
+      aws-sdk-v1 (= 1.53.0)
+    aws-sdk-v1 (1.53.0)
       json (~> 1.4)
       nokogiri (>= 1.4.4)
     bcrypt (3.1.7)
@@ -342,7 +344,7 @@ PLATFORMS
 DEPENDENCIES
   acts-as-taggable-on (~> 3.3.0)
   asset_sync (~> 1.0.0)
-  aws-sdk (~> 1.42.0)
+  aws-sdk
   bcrypt-ruby
   better_errors
   binding_of_caller