Skip to content

Commit ee65b7b

Browse files
committed
FOLIOSYNC-12 extract out processing logic to a new MarcProcessor class
1 parent 9394f8a commit ee65b7b

3 files changed

Lines changed: 126 additions & 86 deletions

File tree

lib/folio_sync/folio_to_hyacinth/hyacinth_synchronizer.rb

Lines changed: 10 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,28 @@ class HyacinthSynchronizer
66
attr_reader :downloading_errors, :syncing_errors
77

88
def initialize
9-
# @logger = Logger.new($stdout)
9+
@logger = Logger.new($stdout)
1010
end
1111

1212
# Performs MARC downloads and syncs resources to Hyacinth
1313
# @param [Integer] last_x_hours Records newer than this are synced.
1414
def download_and_sync_folio_to_hyacinth_records(last_x_hours)
15-
download_marc_from_folio(last_x_hours)
15+
# download_marc_from_folio(last_x_hours)
1616
prepare_hyacinth_records
1717
end
1818

19+
def clear_downloads!
20+
@logger.info('Clearing downloaded MARC files...')
21+
FileUtils.rm_rf(downloaded_marc_files_path)
22+
end
23+
1924
def download_marc_from_folio(last_x_hours)
2025
downloader = FolioSync::FolioToHyacinth::MarcDownloader.new
2126
downloader.download_965hyacinth_marc_records(last_x_hours)
2227

2328
return if downloader.downloading_errors.blank?
2429

25-
puts "Error downloading MARC records from FOLIO: #{downloader.downloading_errors}"
30+
@logger.error("Error downloading MARC records from FOLIO: #{downloader.downloading_errors}")
2631
@downloading_errors = downloader.downloading_errors
2732
end
2833

@@ -42,68 +47,8 @@ def downloaded_marc_files_path
4247
end
4348

4449
def process_marc_file(marc_file_path)
45-
folio_hrid = extract_hrid_from_filename(marc_file_path)
46-
hyacinth_results = fetch_hyacinth_results(marc_file_path)
47-
puts "Found #{hyacinth_results.length} Hyacinth records for FOLIO HRID #{folio_hrid}"
48-
49-
case hyacinth_results.length
50-
when 0
51-
create_new_hyacinth_record(marc_file_path, folio_hrid)
52-
when 1
53-
update_existing_hyacinth_record(marc_file_path, hyacinth_results.first, folio_hrid)
54-
else
55-
handle_multiple_records_error(folio_hrid)
56-
end
57-
rescue StandardError => e
58-
puts "Failed to process #{folio_hrid}: #{e.message}"
59-
@syncing_errors << "Error processing #{folio_hrid}: #{e.message}"
60-
end
61-
62-
def extract_hrid_from_filename(marc_file_path)
63-
File.basename(marc_file_path, '.mrc')
64-
end
65-
66-
def create_new_hyacinth_record(marc_file_path, folio_hrid)
67-
puts "Creating new Hyacinth record for #{folio_hrid}"
68-
69-
new_record = FolioToHyacinthRecord.new(marc_file_path)
70-
response = FolioSync::Hyacinth::Client.instance.create_new_record(
71-
new_record.digital_object_data,
72-
publish: true
73-
)
74-
75-
puts "Created record for #{folio_hrid}: #{response.inspect}"
76-
response
77-
end
78-
79-
def update_existing_hyacinth_record(marc_file_path, existing_record, folio_hrid)
80-
puts "Updating existing Hyacinth record for #{folio_hrid}"
81-
82-
preserved_data = { 'identifiers' => existing_record['identifiers'] }
83-
updated_record = FolioToHyacinthRecord.new(marc_file_path, preserved_data)
84-
85-
response = FolioSync::Hyacinth::Client.instance.update_existing_record(
86-
existing_record['pid'],
87-
updated_record.digital_object_data,
88-
publish: true
89-
)
90-
91-
puts "Updated record #{existing_record['pid']}: #{response.inspect}"
92-
response
93-
end
94-
95-
def handle_multiple_records_error(folio_hrid)
96-
error_message = "Multiple Hyacinth records found for FOLIO HRID #{folio_hrid}"
97-
puts error_message
98-
@syncing_errors << error_message
99-
end
100-
101-
def fetch_hyacinth_results(marc_file_path)
102-
folio_hrid = File.basename(marc_file_path, '.mrc')
103-
potential_clio_identifier = "clio#{folio_hrid}"
104-
client = FolioSync::Hyacinth::Client.instance
105-
client.find_by_identifier(potential_clio_identifier,
106-
{ f: { digital_object_type_display_label_sim: ['Item'] } })
50+
processor = FolioSync::FolioToHyacinth::MarcProcessor.new(marc_file_path)
51+
processor.create_and_sync_hyacinth_record!
10752
end
10853
end
10954
end
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# frozen_string_literal: true
2+
3+
class FolioSync::FolioToHyacinth::MarcProcessor
4+
def initialize(marc_file_path)
5+
@marc_file_path = marc_file_path
6+
@logger = Logger.new($stdout)
7+
@syncing_errors = []
8+
end
9+
10+
def create_and_sync_hyacinth_record!
11+
folio_hrid = extract_hrid_from_filename(@marc_file_path)
12+
hyacinth_results = fetch_hyacinth_results(@marc_file_path)
13+
@logger.info("Found #{hyacinth_results.length} Hyacinth records for FOLIO HRID #{folio_hrid}")
14+
15+
case hyacinth_results.length
16+
when 0
17+
create_new_hyacinth_record(@marc_file_path, folio_hrid)
18+
when 1
19+
update_existing_hyacinth_record(@marc_file_path, hyacinth_results.first, folio_hrid)
20+
else
21+
handle_multiple_records_error(folio_hrid)
22+
end
23+
rescue StandardError => e
24+
@logger.error("Failed to process #{folio_hrid}: #{e.message}")
25+
@syncing_errors << "Error processing #{folio_hrid}: #{e.message}"
26+
end
27+
28+
def update_existing_hyacinth_record(marc_file_path, existing_record, folio_hrid)
29+
@logger.info("Updating existing Hyacinth record for #{folio_hrid}")
30+
31+
preserved_data = { 'identifiers' => existing_record['identifiers'] }
32+
updated_record = FolioToHyacinthRecord.new(marc_file_path, preserved_data)
33+
34+
response = FolioSync::Hyacinth::Client.instance.update_existing_record(
35+
existing_record['pid'],
36+
updated_record.digital_object_data,
37+
publish: true
38+
)
39+
40+
@logger.info("Updated record #{existing_record['pid']}: #{response.inspect}")
41+
response
42+
end
43+
44+
def handle_multiple_records_error(folio_hrid)
45+
error_message = "Multiple Hyacinth records found for FOLIO HRID #{folio_hrid}"
46+
@logger.error(error_message)
47+
@syncing_errors << error_message
48+
end
49+
50+
def fetch_hyacinth_results(marc_file_path)
51+
folio_hrid = File.basename(marc_file_path, '.mrc')
52+
potential_clio_identifier = "clio#{folio_hrid}"
53+
client = FolioSync::Hyacinth::Client.instance
54+
client.find_by_identifier(potential_clio_identifier,
55+
{ f: { digital_object_type_display_label_sim: ['Item'] } })
56+
end
57+
58+
def extract_hrid_from_filename(marc_file_path)
59+
File.basename(marc_file_path, '.mrc')
60+
end
61+
62+
def create_new_hyacinth_record(marc_file_path, folio_hrid)
63+
@logger.info("Creating new Hyacinth record for #{folio_hrid}")
64+
65+
new_record = FolioToHyacinthRecord.new(marc_file_path)
66+
puts "Digital object data: #{new_record.digital_object_data}"
67+
68+
response = FolioSync::Hyacinth::Client.instance.create_new_record(
69+
new_record.digital_object_data,
70+
publish: true
71+
)
72+
73+
@logger.info("Created record for #{folio_hrid}: #{response.inspect}")
74+
response
75+
end
76+
end

lib/tasks/hyacinth_sync.rake

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,49 @@ namespace :folio_sync do
44
namespace :folio_to_hyacinth do
55
task run: :environment do
66
puts 'Starting Folio to Hyacinth sync task...'
7+
8+
modified_since = ENV['modified_since']
9+
10+
modified_since_sanitized =
11+
if modified_since && !modified_since.strip.empty?
12+
begin
13+
Integer(modified_since)
14+
rescue ArgumentError
15+
puts 'Error: modified_since must be an integer (number of hours).'
16+
exit 1
17+
end
18+
end
19+
20+
clear_downloads = ENV['clear_downloads'].nil? || ENV['clear_downloads'] == 'true'
21+
722
synchronizer = FolioSync::FolioToHyacinth::HyacinthSynchronizer.new
8-
synchronizer.download_and_sync_folio_to_hyacinth_records(24)
23+
synchronizer.clear_downloads! if clear_downloads
24+
synchronizer.download_and_sync_folio_to_hyacinth_records(modified_since_sanitized)
25+
26+
# Handle errors
927
end
1028

11-
# task run: :environment do
12-
# modified_since = ENV['modified_since']
13-
# modified_since_num =
14-
# if modified_since && !modified_since.strip.empty?
15-
# begin
16-
# Integer(modified_since)
17-
# rescue ArgumentError
18-
# puts 'Error: modified_since must be an integer (number of hours).'
19-
# exit 1
20-
# end
21-
# end
22-
23-
# downloader = FolioSync::FolioToHyacinth::MarcDownloader.new
24-
# downloader.download_965hyacinth_marc_records(modified_since_num)
25-
26-
# if downloader.downloading_errors.present?
27-
# puts "Errors encountered during MARC download: #{downloader.downloading_errors}"
28-
# exit 1
29-
# end
30-
# end
29+
# Download part only
30+
task download_folio_marc_files: :environment do
31+
modified_since = ENV['modified_since']
32+
modified_since_num =
33+
if modified_since && !modified_since.strip.empty?
34+
begin
35+
Integer(modified_since)
36+
rescue ArgumentError
37+
puts 'Error: modified_since must be an integer (number of hours).'
38+
exit 1
39+
end
40+
end
41+
42+
downloader = FolioSync::FolioToHyacinth::MarcDownloader.new
43+
downloader.download_965hyacinth_marc_records(modified_since_num)
44+
45+
if downloader.downloading_errors.present?
46+
puts "Errors encountered during MARC download: #{downloader.downloading_errors}"
47+
exit 1
48+
end
49+
end
3150

3251
task download_single_file: :environment do
3352
FolioSync::Rake::EnvValidator.validate!(

0 commit comments

Comments
 (0)