mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
53 lines
1.3 KiB
Ruby
53 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Stores a generated report.
|
|
class ReportBlob < ActiveStorage::Blob
|
|
# AWS S3 limits URL expiry to one week.
|
|
LIFETIME = 1.week
|
|
|
|
def self.create_locally!(filename, content)
|
|
create_and_upload!(
|
|
io: StringIO.new(content),
|
|
filename:,
|
|
content_type: content_type(filename),
|
|
identify: false,
|
|
service_name: :local,
|
|
)
|
|
end
|
|
|
|
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:,
|
|
byte_size: 0,
|
|
checksum: "0",
|
|
content_type: content_type(filename),
|
|
service_name: :local,
|
|
).tap do |blob|
|
|
ActiveStorage::PurgeJob.set(wait: LIFETIME).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)
|
|
save!
|
|
end
|
|
|
|
def result
|
|
return if checksum == "0"
|
|
|
|
@result ||= download.force_encoding(Encoding::UTF_8)
|
|
end
|
|
|
|
def expiring_service_url
|
|
url(expires_in: LIFETIME)
|
|
end
|
|
end
|