55 lines
1.3 KiB
Ruby
55 lines
1.3 KiB
Ruby
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||
|
|
||
|
class ApplicationController::HasDownload::DownloadFile < SimpleDelegator
|
||
|
attr_reader :requested_disposition
|
||
|
|
||
|
def initialize(id, disposition: 'inline')
|
||
|
@requested_disposition = disposition
|
||
|
|
||
|
super(Store.find(id))
|
||
|
end
|
||
|
|
||
|
def disposition
|
||
|
return 'attachment' if forcibly_download_as_binary? || !allowed_inline?
|
||
|
|
||
|
requested_disposition
|
||
|
end
|
||
|
|
||
|
def content_type
|
||
|
return ActiveStorage.binary_content_type if forcibly_download_as_binary?
|
||
|
|
||
|
file_content_type
|
||
|
end
|
||
|
|
||
|
def content(view_type)
|
||
|
return __getobj__.content if view_type.blank? || !preferences[:resizable]
|
||
|
|
||
|
return content_inline if content_inline? && view_type == 'inline'
|
||
|
return content_preview if content_preview? && view_type == 'preview'
|
||
|
|
||
|
__getobj__.content
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def allowed_inline?
|
||
|
ActiveStorage.content_types_allowed_inline.include?(content_type)
|
||
|
end
|
||
|
|
||
|
def forcibly_download_as_binary?
|
||
|
ActiveStorage.content_types_to_serve_as_binary.include?(file_content_type)
|
||
|
end
|
||
|
|
||
|
def file_content_type
|
||
|
@file_content_type ||= preferences['Content-Type'] || preferences['Mime-Type'] || ActiveStorage.binary_content_type
|
||
|
end
|
||
|
|
||
|
def content_inline?
|
||
|
preferences[:content_inline] == true
|
||
|
end
|
||
|
|
||
|
def content_preview?
|
||
|
preferences[:content_preview] == true
|
||
|
end
|
||
|
end
|