summaryrefslogtreecommitdiff
path: root/app/services/infrastructure/blob_storage.rb
blob: 0c4d44e4bf3058b2597fc93c68c4f1b631614d75 (plain)
1
2
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
class BlobStorage
  attr_reader :bucket_name

  def initialize(bucket_name = ENV['FOG_DIRECTORY'])
    @bucket_name = bucket_name
  end

  def upload(key, file)
    Rails.logger.info "uploading to #{bucket_name}/#{key}"
    object = object_for(key)
    object.write(Pathname.new(file), options_for(file))
    object.acl = :public_read
  end

  def download(key)
    object = object_for(key)
    File.open("#{Dir.tmpdir}/#{File.basename(key)}", "wb") do |tempfile|
      object.read do |chunk|
        tempfile.write(chunk)
      end
      yield tempfile
    end
  end

  private

  def object_for(key)
    connection.buckets[bucket_name].objects[key]
  end

  def connection
    @connection ||= AWS::S3.new
  end

  def content_type_for(file)
    ::MIME::Types.type_for(file).first.to_s
  end

  def options_for(file)
    {
      content_type: content_type_for(file),
      cache_control: 'public, max-age=315576000',
    }
  end

  class Fake
    def upload(*args)
    end

    def downlaod(*args)
    end
  end
end