From ebb15781d59b3e1bcecea28729ec3f0d637e08b4 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Tue, 4 Apr 2023 15:41:00 +1000 Subject: [PATCH] Store report's filename within the blob For future downloads outside the ReportsController. --- app/controllers/admin/reports_controller.rb | 4 +++- app/models/report_blob.rb | 10 +++++++--- spec/jobs/report_job_spec.rb | 6 +++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index e55bcd8a55..8b57e035d5 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -57,7 +57,9 @@ module Admin def render_report_as(format) if OpenFoodNetwork::FeatureToggle.enabled?(:background_reports, spree_current_user) - blob = ReportBlob.create_for_upload_later! + filename = report_filename + filename = "#{filename}html" if report_format.blank? + blob = ReportBlob.create_for_upload_later!(filename) ReportJob.perform_later( report_class, spree_current_user, params, format, blob ) diff --git a/app/models/report_blob.rb b/app/models/report_blob.rb index 04b7f23758..4ace9d4a7a 100644 --- a/app/models/report_blob.rb +++ b/app/models/report_blob.rb @@ -2,20 +2,24 @@ # Stores a generated report. class ReportBlob < ActiveStorage::Blob - def self.create_for_upload_later! + def self.create_for_upload_later!(filename) # ActiveStorage discourages modifying a blob later but we need a blob # before we know anything about the report file. It enables us to use the # same blob in the controller to read the result. create_before_direct_upload!( - filename: "tbd", + filename: filename, byte_size: 0, checksum: "0", - content_type: "application/octet-stream", + content_type: content_type(filename), ).tap do |blob| ActiveStorage::PurgeJob.set(wait: 1.month).perform_later(blob) end end + def self.content_type(filename) + MIME::Types.of(filename).first&.to_s || "application/octet-stream" + end + def store(content) io = StringIO.new(content) upload(io, identify: false) diff --git a/spec/jobs/report_job_spec.rb b/spec/jobs/report_job_spec.rb index 56ec2c1040..18693cfbf0 100644 --- a/spec/jobs/report_job_spec.rb +++ b/spec/jobs/report_job_spec.rb @@ -9,7 +9,7 @@ describe ReportJob do let(:enterprise) { create(:enterprise) } let(:params) { {} } let(:format) { :csv } - let(:blob) { ReportBlob.create_for_upload_later! } + let(:blob) { ReportBlob.create_for_upload_later!("report.csv") } it "generates a report" do job = perform_enqueued_jobs(only: ReportJob) do @@ -29,6 +29,10 @@ describe ReportJob do end def expect_csv_report + blob.reload + expect(blob.filename.to_s).to eq "report.csv" + expect(blob.content_type).to eq "text/csv" + table = CSV.parse(blob.result) expect(table[0][1]).to eq "Relationship" expect(table[1][1]).to eq "owns"