Module: S3DirectMultipartUpload::Dev::Storage

Defined in:
app/services/s3_direct_multipart_upload/dev/storage.rb

Class Method Summary collapse

Class Method Details

.combine_disk_parts(upload_session) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 49

def combine_disk_parts(upload_session)
  expected = upload_session.expected_parts
  raise "upload is not completed" unless upload_session.completed?

  if expected <= 1
    single_part_path = parts_dir(upload_session).join("1")
    source = single_part_path.exist? ? single_part_path : combined_path(upload_session)
    raise "part is missing" unless source.exist?

    FileUtils.cp(source, combined_path(upload_session))
    return combined_path(upload_session)
  end

  io = StringIO.new
  (1..expected).each do |part_number|
    part_path = parts_dir(upload_session).join(part_number.to_s)
    raise "missing part #{part_number}" unless part_path.exist?

    io.write(File.binread(part_path))
  end

  File.binwrite(combined_path(upload_session), io.string)
  combined_path(upload_session)
end

.combine_parts(upload_session) ⇒ Object



21
22
23
24
25
26
27
28
29
30
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 21

def combine_parts(upload_session)
  raise "download is available only in development/test" unless dev_environment?
  ensure_directories(upload_session)

  if disk_service?(upload_session)
    combine_disk_parts(upload_session)
  else
    download_s3_object(upload_session)
  end
end

.combined_file_exist?(upload_session) ⇒ Boolean

Returns:



32
33
34
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 32

def combined_file_exist?(upload_session)
  combined_path(upload_session).exist?
end

.combined_path(upload_session) ⇒ Object



13
14
15
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 13

def combined_path(upload_session)
  root.join(upload_session.object_key.to_s.sub(/\A\//, ""))
end

.dev_environment?Boolean

Returns:



36
37
38
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 36

def dev_environment?
  Rails.env.development? || Rails.env.test?
end

.disk_service?(upload_session) ⇒ Boolean

Returns:



40
41
42
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 40

def disk_service?(upload_session)
  upload_session.class.send(:disk_service?)
end

.download_s3_object(upload_session) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 74

def download_s3_object(upload_session)
  client = upload_session.class.s3_client
  client.get_object(
    bucket: upload_session.bucket,
    key: upload_session.object_key,
    response_target: combined_path(upload_session)
  )
  combined_path(upload_session)
end

.ensure_directories(upload_session) ⇒ Object



44
45
46
47
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 44

def ensure_directories(upload_session)
  FileUtils.mkdir_p(combined_path(upload_session).dirname)
  FileUtils.mkdir_p(parts_dir(upload_session))
end

.parts_dir(upload_session) ⇒ Object



17
18
19
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 17

def parts_dir(upload_session)
  combined_path(upload_session).dirname.join("#{combined_path(upload_session).basename}.parts")
end

.rootObject



9
10
11
# File 'app/services/s3_direct_multipart_upload/dev/storage.rb', line 9

def root
  Rails.root.join("tmp/s3_direct_multipart_upload")
end