Module: Tasks::PackagerController
- Extended by:
- ActiveSupport::Concern
- 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
- #build_zip_filename(prefix, index, total) ⇒ Object private
- #download_packager(packager:, group_index:, empty_message:, filename_prefix:, entry_selector: nil) ⇒ Object private
- #preview_packager(packager:, payload_key:) ⇒ Object private
-
#requested_max_bytes ⇒ Object
private
Returns max bytes for grouping.
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: }, 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_bytes ⇒ Object (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 |