From 20af19c912d302711d47f421e7e89d7909a3e41e Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 12 Oct 2023 17:37:10 +1100 Subject: [PATCH] Simplify report file storage --- app/jobs/report_job.rb | 3 +-- app/models/report_blob.rb | 25 +++++-------------------- spec/mailers/report_mailer_spec.rb | 2 +- spec/models/report_blob_spec.rb | 3 +-- 4 files changed, 8 insertions(+), 25 deletions(-) diff --git a/app/jobs/report_job.rb b/app/jobs/report_job.rb index f2268f794d..c72cb98b2e 100644 --- a/app/jobs/report_job.rb +++ b/app/jobs/report_job.rb @@ -14,8 +14,7 @@ class ReportJob < ApplicationJob report = report_class.new(user, params, render: true) result = report.render_as(format) - blob = ReportBlob.create_for_upload_later!(filename) - blob.store(result) + blob = ReportBlob.create!(filename, result) execution_time = Time.zone.now - start_time diff --git a/app/models/report_blob.rb b/app/models/report_blob.rb index fb382fba31..a57bb31538 100644 --- a/app/models/report_blob.rb +++ b/app/models/report_blob.rb @@ -5,34 +5,19 @@ class ReportBlob < ActiveStorage::Blob # AWS S3 limits URL expiry to one week. LIFETIME = 1.week - 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!( + def self.create!(filename, content) + create_and_upload!( + io: StringIO.new(content), filename:, - byte_size: 0, - checksum: "0", content_type: content_type(filename), - ).tap do |blob| - ActiveStorage::PurgeJob.set(wait: LIFETIME).perform_later(blob) - end + identify: false, + ) 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) - save! - end - - def content_stored? - @content_stored ||= reload.checksum != "0" - end - def result @result ||= download.force_encoding(Encoding::UTF_8) end diff --git a/spec/mailers/report_mailer_spec.rb b/spec/mailers/report_mailer_spec.rb index 443617afd3..54a63845ea 100644 --- a/spec/mailers/report_mailer_spec.rb +++ b/spec/mailers/report_mailer_spec.rb @@ -10,7 +10,7 @@ describe ReportMailer do blob:, ).report_ready } - let(:blob) { ReportBlob.create_for_upload_later!("customers.csv") } + let(:blob) { ReportBlob.create!("customers.csv", "report content") } it "notifies about a report" do expect(email.subject).to eq "Report ready" diff --git a/spec/models/report_blob_spec.rb b/spec/models/report_blob_spec.rb index d16acc8fe0..1238ae1564 100644 --- a/spec/models/report_blob_spec.rb +++ b/spec/models/report_blob_spec.rb @@ -4,11 +4,10 @@ require 'spec_helper' describe ReportBlob, type: :model do it "preserves UTF-8 content" do - blob = ReportBlob.create_for_upload_later!("customers.html") content = "This works. ✓" expect do - blob.store(content) + blob = ReportBlob.create!("customers.html", content) content = blob.result end.to_not change { content.encoding }.from(Encoding::UTF_8) end