Module: Tasks::PackagerController

Extended by:
ActiveSupport::Concern
Included in:
Images::ImagesPackagerController, Sources::DocumentsPackagerController
Defined in:
app/controllers/concerns/tasks/packager_controller.rb

Constant Summary collapse

DEFAULT_MAX_MB =
1_000
MIN_MAX_MB =
10
MAX_MAX_MB =
1_000

Instance Method Summary collapse

Instance Method Details

#build_zip_filename(prefix, index, total) ⇒ Object (private)



29
30
31
32
# File 'app/controllers/concerns/tasks/packager_controller.rb', line 29

def build_zip_filename(prefix, index, total)
  date = Time.zone.today.strftime('%-m_%-d_%y')
  Zaru.sanitize!("#{prefix}-#{date}-#{index}_of_#{total}.zip").gsub(' ', '_')
end

#download_packager(packager:, group_index:, empty_message:, filename_prefix:, entry_selector: nil) ⇒ Object (private)



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/controllers/concerns/tasks/packager_controller.rb', line 34

def download_packager(packager:, group_index:, empty_message:, filename_prefix:, entry_selector: nil)
  render json: { error: empty_message }, status: :unprocessable_content and return if @query_params.blank?
  render json: { error: 'Invalid group index.' }, status: :bad_request and return if group_index < 0

  max_bytes = requested_max_bytes
  groups = packager.groups(max_bytes: max_bytes)
  group = groups[group_index]

  render json: { error: 'Group not found.' }, status: :not_found and return if group.blank?

  entry_selector ||= ->(group_entries, packager_instance) {
    # Exclude entries which aren't backed by an actual file (e.g.
    # exclude Images for which the image file has been deleted).
    group_entries.select { |entry| packager_instance.file_available?(entry) }
  }
  entries = entry_selector.call(group, packager)

  render json: { error: 'No files available for this package.' }, status: :unprocessable_content and return if entries.empty?

  filename = build_zip_filename(filename_prefix, group_index + 1, groups.length)
  response.headers['Content-Disposition'] = "attachment; filename=\"#{filename}\""
  packager.stream(entries: entries, zip_streamer: method(:zip_tricks_stream), group_index: group_index)
end

#preview_packager(packager:, payload_key:) ⇒ Object (private)



58
59
60
61
62
63
64
65
66
67
68
# File 'app/controllers/concerns/tasks/packager_controller.rb', line 58

def preview_packager(packager:, payload_key:)
  max_bytes = requested_max_bytes
  preview_data = packager.preview(max_bytes: max_bytes)

  render json: {
    payload_key => preview_data[payload_key],
    groups: preview_data[:groups],
    filter_params: @query_params,
    max_bytes: max_bytes
  }
end

#requested_max_bytesObject (private)

Returns max bytes for grouping. Uses decimal MB (1,000,000 bytes) not binary MiB (1,048,576 bytes) for user-friendliness.



17
18
19
20
21
22
23
24
25
26
27
# File 'app/controllers/concerns/tasks/packager_controller.rb', line 17

def requested_max_bytes
  mb = params[:max_mb].presence
  mb = mb.to_f if mb
  mb = if mb && mb.positive?
         mb
       else
         DEFAULT_MAX_MB
       end
  mb = mb.clamp(MIN_MAX_MB, MAX_MAX_MB)
  (mb * 1_000_000).to_i
end