Files
openfoodnetwork/app/controllers/admin/reports_controller.rb
2023-04-14 11:29:36 +10:00

101 lines
2.5 KiB
Ruby

# frozen_string_literal: true
module Admin
class ReportsController < Spree::Admin::BaseController
include ActiveStorage::SetCurrent
include ReportsActions
helper ReportsHelper
before_action :authorize_report, only: [:show]
# Define model class for Can? permissions
def model_class
Admin::ReportsController
end
def index
@reports = reports.select do |report_type, _description|
can? report_type, :report
end
end
def show
@report = report_class.new(spree_current_user, params, render: render_data?)
if params[:report_format].present?
export_report
else
show_report
end
rescue Timeout::Error
render_timeout_error
end
private
def export_report
send_data render_report_as(report_format), filename: report_filename
end
def show_report
assign_view_data
@table = render_report_as(:html) if render_data?
render "show"
end
def assign_view_data
@report_type = report_type
@report_subtypes = report_subtypes
@report_subtype = report_subtype
@report_title = report_title
@rendering_options = rendering_options
@data = Reporting::FrontendData.new(spree_current_user)
end
def render_data?
request.post?
end
def render_report_as(format)
if OpenFoodNetwork::FeatureToggle.enabled?(:background_reports, spree_current_user)
@blob = ReportBlob.create_for_upload_later!(report_filename)
ReportJob.perform_later(
report_class, spree_current_user, params, format, @blob
)
Timeout.timeout(max_wait_time) do
sleep 1 until @blob.content_stored?
end
# This result has been rendered by Rails in safe mode already.
@blob.result.html_safe # rubocop:disable Rails/OutputSafety
else
@report.render_as(format)
end
end
def render_timeout_error
assign_view_data
if @blob
@error = ".report_taking_longer_html"
@error_url = @blob.url
else
@error = ".report_taking_longer"
@error_url = ""
end
render "show"
end
def max_wait_time
# This value is used by rack-timeout and nginx, usually 30 seconds in
# staging and production:
server_timeout = ENV.fetch("RACK_TIMEOUT_SERVICE_TIMEOUT", "15").to_f
# Zero disables the timeout:
return 0 if server_timeout.zero?
# We want to time out earlier than nginx:
server_timeout - 2.seconds
end
end
end