Skip to content

Commit

Permalink
Adds WorkMembersCleanUpJob. (#2238)
Browse files Browse the repository at this point in the history
* Adds WorkMembersCleanUpJob.

* Refactors to lower cog com.
  • Loading branch information
bwatson78 authored Feb 15, 2024
1 parent 3e99a73 commit 9adcad2
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 12 deletions.
41 changes: 29 additions & 12 deletions app/controllers/background_jobs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,33 @@ class BackgroundJobsController < ApplicationController
def new; end

def create
if params[:jobs] == 'cleanup'
FileSetCleanUpJob.perform_later
redirect_to new_background_job_path, notice: "File Set Cleanup Job has started successfully."
elsif params[:jobs] == 'preservation'
generic_csv_action(params[:preservation_csv], PreservationWorkflowImporterJob)
redirect_to new_background_job_path, notice: "Preservation Workflow Importer Job has started successfully."
elsif params[:jobs] == 'aws_fixity'
generic_csv_action(params[:aws_fixity_csv], ProcessAwsFixityPreservationEventsJob)
redirect_to new_background_job_path, notice: "AWS Fixity Preservation Events Importer Job has been added to the queue."
elsif params[:jobs].include?('_preprocessor')
if params[:jobs].include?('_preprocessor')
preprocessor_actions
else
reindex_objects_action
redirect_to new_background_job_path, notice: "Reindex Files Job has started successfully."
process_non_preprocessor_jobs
end
end

private

def process_non_preprocessor_jobs
if params[:jobs] == 'cleanup'
FileSetCleanUpJob.perform_later
redirect_to new_background_job_path, notice: "File Set Cleanup Job has started successfully."
elsif params[:jobs] == 'work_members_cleanup'
process_work_members_cleanup(params[:work_members_cleanup_text])
elsif params[:jobs] == 'preservation'
generic_csv_action(params[:preservation_csv], PreservationWorkflowImporterJob)
redirect_to new_background_job_path, notice: "Preservation Workflow Importer Job has started successfully."
elsif params[:jobs] == 'aws_fixity'
generic_csv_action(params[:aws_fixity_csv], ProcessAwsFixityPreservationEventsJob)
redirect_to new_background_job_path, notice: "AWS Fixity Preservation Events Importer Job has been added to the queue."
else
reindex_objects_action
redirect_to new_background_job_path, notice: "Reindex Files Job has started successfully."
end
end

def reindex_objects_action
CSV.foreach(params[:reindex_csv].path, headers: true) do |row|
r = row.to_h
Expand Down Expand Up @@ -78,4 +86,13 @@ def generic_csv_action(csv_param, job_class)
File.open(path, "w+") { |f| f.write(csv_param.read) }
job_class.perform_later(path.to_s)
end

def process_work_members_cleanup(text_from_box)
if text_from_box.length < 14
redirect_to new_background_job_path, alert: 'Please enter at least one Work ID in the text box.'
else
WorkMembersCleanUpJob.perform_later(text_from_box)
redirect_to new_background_job_path, notice: "Work Members Cleanup Job has been added to the queue."
end
end
end
19 changes: 19 additions & 0 deletions app/jobs/replace_work_members_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# frozen_string_literal: true

class ReplaceWorkMembersJob < Hyrax::ApplicationJob
def perform(work, cleaned_member_ids)
file_sets = cleaned_member_ids.map { |id| FileSet.find(id) }

work.ordered_members = file_sets
work.save
regen_manifest(work)
end

def regen_manifest(work)
solr_doc = SolrDocument.find(work.id)
ability = ManifestAbility.new
presenter = Hyrax::CurateGenericWorkPresenter.new(solr_doc, ability)

ManifestBuilderService.regenerate_manifest(presenter: presenter, curation_concern: work)
end
end
33 changes: 33 additions & 0 deletions app/jobs/work_members_clean_up_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# frozen_string_literal: true

class WorkMembersCleanUpJob < Hyrax::ApplicationJob
def perform(comma_separated_work_ids = nil)
work_ids = comma_separated_work_ids&.split(',')
raise 'The required work ids separated by commas were not provided.' if work_ids.blank?

works = pull_works_by_ids(work_ids)
works.each { |work| clean_up_work_member(work) }
end

def pull_works_by_ids(work_ids)
ret_arr = []
work_ids.each do |id|
ret_arr << CurateGenericWork.find(id)
rescue
Rails.logger.error "The id #{id} did not match a work in the system."
next
end
ret_arr
end

def clean_up_work_member(work)
members_count = work.ordered_member_ids.size
cleaned_member_ids = work.ordered_member_ids.compact.uniq

if members_count != cleaned_member_ids.size
ReplaceWorkMembersJob.perform_later(work, cleaned_member_ids)
else
Rails.logger.error 'No nil or duplicate work members were found.'
end
end
end
9 changes: 9 additions & 0 deletions app/views/background_jobs/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@
</td>
<td>N/A</td>
</tr>
<tr>
<td>
<%= radio_button_tag :jobs, 'work_members_cleanup', false, id: 'work_members_cleanup' %>
<%= label :job_cleanup, 'Work Members Cleanup' %>
</td>
<td>
<%= text_area_tag 'work_members_cleanup_text', nil, size: '60x2', placeholder: 'Work IDs separated by commas. e.g. "515bcc2hx0-cor,212bcc2hx0-cor"' %>
</td>
</tr>
<tr>
<td>
<%= radio_button_tag :jobs, 'reindex', false, id: 'reindex' %>
Expand Down
8 changes: 8 additions & 0 deletions spec/controllers/background_jobs_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
let(:aws_fixity) do
post :create, params: { jobs: 'aws_fixity', aws_fixity_csv: csv_file3, format: 'json' }
end
let(:work_members_cleanup) do
post :create, params: { jobs: 'work_members_cleanup', work_members_cleanup_text: '576rxwdbs7-cor' }
end

it "successfully starts a file_set cleanup background job" do
expect(cleanup).to redirect_to(new_background_job_path)
Expand All @@ -64,6 +67,11 @@
expect(ProcessAwsFixityPreservationEventsJob).to have_been_enqueued
end

it "successfully starts a work members cleanup background job" do
expect(work_members_cleanup).to redirect_to(new_background_job_path)
expect(WorkMembersCleanUpJob).to have_been_enqueued
end

# Deprecation Warning: As of Curate v3, Zizia will be removed. These preprocessors contain
# custom logic that switches expected output based on whether Bulkrax is or isn't the importer.
# This should be refactored to only export Bulkrax expected fields when Zizia is removed.
Expand Down
22 changes: 22 additions & 0 deletions spec/jobs/replace_work_members_job_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe ReplaceWorkMembersJob, :clean do
let(:work) { FactoryBot.create(:work) }
let(:file_set) { FactoryBot.create(:file_set) }

before do
work.ordered_members = [file_set, file_set]
work.save
end

# NOTE: We unfortunately cannot save nil objects into the #ordered_members attribute.
# That phenomenon only occurs during Zizia imports using the "shovelling" technique
# of adding FileSets to a Work.
it 'calls the expected methods' do
expect(FileSet).to receive(:find).with(file_set.id).and_return(file_set)
expect(work).to receive(:ordered_members=).with([file_set])
expect(work).to receive(:save)
described_class.perform_now(work, [file_set.id])
end
end
49 changes: 49 additions & 0 deletions spec/jobs/work_members_clean_up_job_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe WorkMembersCleanUpJob, :clean do
let(:work) { FactoryBot.create(:work) }
let(:file_set) { FactoryBot.create(:file_set) }

context 'when called without ids' do
it 'returns an error' do
expect { described_class.perform_now }.to(
raise_error(
RuntimeError,
'The required work ids separated by commas were not provided.'
)
)
end
end

context 'when called with work with no duplicates or nil objects in #ordered_members' do
before do
work.ordered_members = [file_set]
work.save
end

it 'finds work and does not process ReplaceWorkMembersJob' do
expect(CurateGenericWork).to receive(:find).with(work.id).and_return(work)
expect(Rails.logger).to receive(:error).with('No nil or duplicate work members were found.')
expect(ReplaceWorkMembersJob).not_to receive(:perform_later).with(work, [file_set.id])
described_class.perform_now(work.id)
end
end

# NOTE: We unfortunately cannot save nil objects into the #ordered_members attribute.
# That phenomenon only occurs during Zizia imports using the "shovelling" technique
# of adding FileSets to a Work.
context 'when called with a work that contains duplicate objects in #ordered_members' do
before do
work.ordered_members = [file_set, file_set]
work.save
end

it 'finds work and processes ReplaceWorkMembersJob' do
expect(CurateGenericWork).to receive(:find).with(work.id).and_return(work)
expect(Rails.logger).not_to receive(:error).with('No nil or duplicate work members were found.')
expect(ReplaceWorkMembersJob).to receive(:perform_later).with(work, [file_set.id])
described_class.perform_now(work.id)
end
end
end

0 comments on commit 9adcad2

Please # to comment.