diff --git a/app/controllers/data_api/tad_data_exports_controller.rb b/app/controllers/data_api/tad_data_exports_controller.rb index a04a072d95d..3bf0e761545 100644 --- a/app/controllers/data_api/tad_data_exports_controller.rb +++ b/app/controllers/data_api/tad_data_exports_controller.rb @@ -100,7 +100,7 @@ def exports def serve_export(export) export.update!(audit_comment: "File downloaded via API using token ID #{@authenticating_token.id}") - send_data export.data, filename: export.filename + send_data export.file.download, filename: export.filename end def statement_timeout diff --git a/app/controllers/support_interface/data_exports_controller.rb b/app/controllers/support_interface/data_exports_controller.rb index 902f03764a4..3879706aa12 100644 --- a/app/controllers/support_interface/data_exports_controller.rb +++ b/app/controllers/support_interface/data_exports_controller.rb @@ -48,7 +48,8 @@ def create def download data_export = DataExport.find(params[:id]) data_export.update!(audit_comment: 'File downloaded') - send_data data_export.data, filename: data_export.filename, disposition: :attachment + + redirect_to rails_blob_path(data_export.file, disposition: 'attachment') end def data_set_documentation diff --git a/app/models/data_export.rb b/app/models/data_export.rb index 9a70b33f631..03e778b4a48 100644 --- a/app/models/data_export.rb +++ b/app/models/data_export.rb @@ -233,6 +233,9 @@ class DataExport < ApplicationRecord }.freeze belongs_to :initiator, polymorphic: true, optional: true + + has_one_attached :file + audited except: [:data] def filename diff --git a/app/services/data_migrations/migrate_data_export_data_to_file.rb b/app/services/data_migrations/migrate_data_export_data_to_file.rb new file mode 100644 index 00000000000..d487069bfe7 --- /dev/null +++ b/app/services/data_migrations/migrate_data_export_data_to_file.rb @@ -0,0 +1,12 @@ +module DataMigrations + class MigrateDataExportDataToFile + TIMESTAMP = 20240528140244 + MANUAL_RUN = false + + def change + DataExport.find_each do |data_export| + data_export.file.attach(io: CSV.new(data_export.data).to_io, filename: data_export.filename) + end + end + end +end diff --git a/app/workers/data_exporter.rb b/app/workers/data_exporter.rb index 55046bffca7..a8cbada40fd 100644 --- a/app/workers/data_exporter.rb +++ b/app/workers/data_exporter.rb @@ -22,9 +22,10 @@ def perform(importer_class, data_export_type, export_options = {}) Rails.logger.info 'Finished CSV generation' Rails.logger.info 'Started writing CSV' + data_export.update!( - data: csv_data, - completed_at: Time.zone.now, + file: { io: CSV.new(csv_data).to_io, filename: data_export.filename }, + completed_at: Time.current, ) Rails.logger.info 'Finished writing CSV. Sidekiq done' diff --git a/lib/tasks/data.rake b/lib/tasks/data.rake index c72fb28da00..5f5133b0477 100644 --- a/lib/tasks/data.rake +++ b/lib/tasks/data.rake @@ -1,5 +1,6 @@ DATA_MIGRATION_SERVICES = [ # do not delete or edit this line - services added below by generator + 'DataMigrations::MigrateDataExportDataToFile', 'DataMigrations::RemoveCoursesNotOnPublish', 'DataMigrations::RemoveIncidentEvictionFeatureFlag', 'DataMigrations::RemoveCourseHasVacanciesFeatureFlag', diff --git a/spec/services/data_migrations/migrate_data_export_data_to_file_spec.rb b/spec/services/data_migrations/migrate_data_export_data_to_file_spec.rb new file mode 100644 index 00000000000..b34843de515 --- /dev/null +++ b/spec/services/data_migrations/migrate_data_export_data_to_file_spec.rb @@ -0,0 +1,16 @@ +require 'rails_helper' + +RSpec.describe DataMigrations::MigrateDataExportDataToFile do + let(:csv_string) { "email_template,send_count\nsign_in_email,1" } + + it "updates all existing DataExport records 'data' fields and puts them into 'file' attachments" do + data_export = create(:data_export, data: csv_string, file: nil) + + described_class.new.change + + data_export.reload + + expect(data_export.file).to be_attached + expect(data_export.file.download).to eq(csv_string) + end +end