class AssetsController < ApplicationController include ActionView::Helpers::TextHelper before_action :load_vars before_action :check_read_permission, except: :file_present def file_present respond_to do |format| format.json do if @asset.file.processing? render json: {}, status: 404 else # Only if file is present, # check_read_permission check_read_permission # If check_read_permission already rendered error, # stop execution return if performed? # If check permission passes, return :ok render json: { 'asset-id' => @asset.id, 'image-tag-url' => @asset.url(:medium), 'preview-url' => large_image_url_asset_path(@asset), 'filename' => truncate(@asset.file_file_name, length: Constants::FILENAME_TRUNCATION_LENGTH), 'download-url' => download_asset_path(@asset), 'type' => (@asset.is_image? ? 'image' : 'file') }, status: 200 end end end end def large_image_url respond_to do |format| format.json do render json: { 'large-preview-url' => @asset.url(:large), 'filename' => truncate(@asset.file_file_name, length: Constants::FILENAME_TRUNCATION_LENGTH), 'download-url' => download_asset_path(@asset), 'type' => (@asset.is_image? ? 'image' : 'file') } end end end def download if !@asset.file_present render_404 and return elsif @asset.file.is_stored_on_s3? redirect_to @asset.presigned_url(download: true), status: 307 else send_file @asset.file.path, filename: URI.unescape(@asset.file_file_name), type: @asset.file_content_type end end private def load_vars @asset = Asset.find_by_id(params[:id]) unless @asset render_404 end step_assoc = @asset.step result_assoc = @asset.result @assoc = step_assoc if not step_assoc.nil? @assoc = result_assoc if not result_assoc.nil? if @assoc.class == Step @protocol = @asset.step.protocol else @my_module = @assoc.my_module end end def check_read_permission if @assoc.class == Step unless can_view_or_download_step_assets(@protocol) render_403 and return end elsif @assoc.class == Result unless can_view_or_download_result_assets(@my_module) render_403 and return end end end def asset_params params.permit( :file ) end end