hensei-api/lib/post_deployment/manager.rb
Justin Edmund 5f1fafcc50 Made PostDeploymentManager modular
We broke PostDeploymentManager out into several files to make it easier to maintain.

We also added a "force" mode that forces the script to consider all CSV files. This is useful for testing the post-deploy script itself. This should only be used in test mode or you will dirty your database.

We also fine tuned some of the logging to make sure that both verbose and non-verbose modes are helpful.
2025-01-15 14:55:28 -08:00

140 lines
3.7 KiB
Ruby

# frozen_string_literal: true
require_relative 'test_mode_transaction'
require_relative 'database_migrator'
require_relative 'data_importer'
require_relative 'image_downloader'
require_relative 'search_indexer'
require_relative '../logging_helper'
module PostDeployment
class Manager
include LoggingHelper
def initialize(options = {})
@test_mode = options.fetch(:test_mode, false)
@verbose = options.fetch(:verbose, false)
@storage = options.fetch(:storage, :both)
@force = options.fetch(:force, false)
@new_records = Hash.new { |h, k| h[k] = [] }
@updated_records = Hash.new { |h, k| h[k] = [] }
@test_transaction = TestModeTransaction.new if @test_mode
end
def run
migrate_database
import_new_data
display_import_summary
download_images
rebuild_search_indices
display_completion_message
rescue => e
handle_error(e)
end
private
def migrate_database
DatabaseMigrator.new(
test_mode: @test_mode,
verbose: @verbose
).run
end
def import_new_data
log_header 'Importing new data...'
puts "\n"
importer = DataImporter.new(
test_mode: @test_mode,
verbose: @verbose,
test_transaction: @test_transaction,
force: @force
)
process_imports(importer)
end
def process_imports(importer)
importer.process_all_files do |result|
merge_import_results(result)
end
end
def merge_import_results(result)
result[:new].each do |type, records|
@new_records[type].concat(records)
end
result[:updated].each do |type, records|
@updated_records[type].concat(records)
end
end
def download_images
return if all_records_empty?
ImageDownloader.new(
test_mode: @test_mode,
verbose: @verbose,
storage: @storage,
new_records: @new_records,
updated_records: @updated_records
).run
end
def rebuild_search_indices
SearchIndexer.new(
test_mode: @test_mode,
verbose: @verbose
).rebuild_all
end
def display_import_summary
if @new_records.size > 0 || @updated_records.size > 0
log_header 'Import Summary', '-'
display_record_summary('New', @new_records)
display_record_summary('Updated', @updated_records)
else
log_step "\nNo new records imported."
end
end
def display_record_summary(label, records)
records.each do |type, items|
next if items.empty?
count = items.size
puts "\n#{type.capitalize}: #{count} #{label.downcase} #{count == 1 ? 'record' : 'records'}"
items.each do |item|
if @test_mode
puts "#{item[:name_en]} (ID: #{item[:granblue_id]})"
else
puts "#{item.name_en} (ID: #{item.granblue_id})"
end
end
end
end
def display_completion_message
if @test_mode
log_header "✅ Test run completed successfully!", "-"
puts "\n"
log_step "#{@new_records.values.flatten.size} records would be created"
log_step "#{@updated_records.values.flatten.size} records would be updated"
puts "\n"
else
log_header "✅ Post-deployment tasks completed successfully!"
end
end
def handle_error(error)
log_error("\nError during deployment: #{error.message}")
log_error(error.backtrace.take(10).join("\n")) if @verbose
@test_transaction&.rollback
raise error
end
def all_records_empty?
@new_records.values.all?(&:empty?) && @updated_records.values.all?(&:empty?)
end
end
end