From 6ef73b33b79b754ad46041dbc44520f11c34cbec Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Thu, 15 Dec 2022 14:14:52 +0000 Subject: [PATCH] add job to process bulk uploads --- app/jobs/process_bulk_upload_job.rb | 7 +++++ .../bulk_upload_lettings/upload_your_file.rb | 2 ++ .../bulk_upload_sales/upload_your_file.rb | 2 ++ app/services/bulk_upload/processor.rb | 30 +++++++++++++++++++ .../upload_your_file_spec.rb | 6 ++++ .../upload_your_file_spec.rb | 6 ++++ spec/services/bulk_upload/processor_spec.rb | 19 ++++++++++++ 7 files changed, 72 insertions(+) create mode 100644 app/jobs/process_bulk_upload_job.rb create mode 100644 app/services/bulk_upload/processor.rb create mode 100644 spec/services/bulk_upload/processor_spec.rb diff --git a/app/jobs/process_bulk_upload_job.rb b/app/jobs/process_bulk_upload_job.rb new file mode 100644 index 000000000..59be3ec9e --- /dev/null +++ b/app/jobs/process_bulk_upload_job.rb @@ -0,0 +1,7 @@ +class ProcessBulkUploadJob < ApplicationJob + queue_as :default + + def perform(bulk_upload:) + BulkUpload::Processor.new(bulk_upload:).call + end +end diff --git a/app/models/forms/bulk_upload_lettings/upload_your_file.rb b/app/models/forms/bulk_upload_lettings/upload_your_file.rb index 3c5868a8d..57ac017a3 100644 --- a/app/models/forms/bulk_upload_lettings/upload_your_file.rb +++ b/app/models/forms/bulk_upload_lettings/upload_your_file.rb @@ -43,6 +43,8 @@ module Forms storage_service.write_file(bulk_upload.identifier, File.read(file.path)) + ProcessBulkUploadJob.perform_later(bulk_upload:) + true end diff --git a/app/models/forms/bulk_upload_sales/upload_your_file.rb b/app/models/forms/bulk_upload_sales/upload_your_file.rb index b8454000b..be65144e1 100644 --- a/app/models/forms/bulk_upload_sales/upload_your_file.rb +++ b/app/models/forms/bulk_upload_sales/upload_your_file.rb @@ -42,6 +42,8 @@ module Forms storage_service.write_file(bulk_upload.identifier, File.read(file.path)) end + ProcessBulkUploadJob.perform_later(bulk_upload:) + true end diff --git a/app/services/bulk_upload/processor.rb b/app/services/bulk_upload/processor.rb new file mode 100644 index 000000000..f64eb48b0 --- /dev/null +++ b/app/services/bulk_upload/processor.rb @@ -0,0 +1,30 @@ +class BulkUpload::Processor + attr_reader :bulk_upload + + def initialize(bulk_upload:) + @bulk_upload = bulk_upload + end + + def call + download + validator.call + end + +private + + def downloader + @downloader ||= BulkUpload::Downloader.new(bulk_upload:) + end + + def download + downloader.call + end + + # TODO: handle sales + def validator + @validator ||= BulkUpload::Lettings::Validator.new( + bulk_upload:, + path: downloader.path, + ) + end +end diff --git a/spec/models/forms/bulk_upload_lettings/upload_your_file_spec.rb b/spec/models/forms/bulk_upload_lettings/upload_your_file_spec.rb index 49f7510ef..a71d446fe 100644 --- a/spec/models/forms/bulk_upload_lettings/upload_your_file_spec.rb +++ b/spec/models/forms/bulk_upload_lettings/upload_your_file_spec.rb @@ -51,5 +51,11 @@ RSpec.describe Forms::BulkUploadLettings::UploadYourFile do expect(Storage::S3Service).to have_received(:new) expect(mock_storage_service).to have_received(:write_file).with(bulk_upload.identifier, actual_file.read) end + + it "enqueues job to process bulk upload" do + expect { + form.save! + }.to have_enqueued_job(ProcessBulkUploadJob) + end end end diff --git a/spec/models/forms/bulk_upload_sales/upload_your_file_spec.rb b/spec/models/forms/bulk_upload_sales/upload_your_file_spec.rb index 8e7497633..512e85aa2 100644 --- a/spec/models/forms/bulk_upload_sales/upload_your_file_spec.rb +++ b/spec/models/forms/bulk_upload_sales/upload_your_file_spec.rb @@ -49,5 +49,11 @@ RSpec.describe Forms::BulkUploadSales::UploadYourFile do expect(Storage::S3Service).to have_received(:new) expect(mock_storage_service).to have_received(:write_file).with(bulk_upload.identifier, actual_file.read) end + + it "enqueues job to process bulk upload" do + expect { + form.save! + }.to have_enqueued_job(ProcessBulkUploadJob) + end end end diff --git a/spec/services/bulk_upload/processor_spec.rb b/spec/services/bulk_upload/processor_spec.rb new file mode 100644 index 000000000..485a91acb --- /dev/null +++ b/spec/services/bulk_upload/processor_spec.rb @@ -0,0 +1,19 @@ +require "rails_helper" + +RSpec.describe BulkUpload::Processor do + subject(:processor) { described_class.new(bulk_upload:) } + + let(:bulk_upload) { create(:bulk_upload) } + + context "when processing a bulk upload with errors" do + describe "#call" do + let(:mock_downloader) { instance_double(BulkUpload::Downloader, call: nil) } + + it "persist the validation errors" do + allow(BulkUpload::Downloader).to receive(:new).with(bulk_upload:).and_return(mock_downloader) + + expect { processor.call }.to change(BulkUploadError, :count).by(103) + end + end + end +end