2025-06-28 06:22:56 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
class Users::ImportData::Imports
|
|
|
|
|
def initialize(user, imports_data, files_directory)
|
|
|
|
|
@user = user
|
|
|
|
|
@imports_data = imports_data
|
|
|
|
|
@files_directory = files_directory
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def call
|
|
|
|
|
return [0, 0] unless imports_data.is_a?(Array)
|
|
|
|
|
|
|
|
|
|
Rails.logger.info "Importing #{imports_data.size} imports for user: #{user.email}"
|
|
|
|
|
|
|
|
|
|
imports_created = 0
|
|
|
|
|
files_restored = 0
|
|
|
|
|
|
|
|
|
|
imports_data.each do |import_data|
|
|
|
|
|
next unless import_data.is_a?(Hash)
|
|
|
|
|
|
|
|
|
|
existing_import = user.imports.find_by(
|
|
|
|
|
name: import_data['name'],
|
|
|
|
|
source: import_data['source'],
|
|
|
|
|
created_at: import_data['created_at']
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if existing_import
|
|
|
|
|
Rails.logger.debug "Import already exists: #{import_data['name']}"
|
|
|
|
|
next
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
import_record = create_import_record(import_data)
|
|
|
|
|
next unless import_record # Skip if creation failed
|
|
|
|
|
|
|
|
|
|
imports_created += 1
|
|
|
|
|
|
|
|
|
|
if import_data['file_name'] && restore_import_file(import_record, import_data)
|
|
|
|
|
files_restored += 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Rails.logger.info "Imports import completed. Created: #{imports_created}, Files restored: #{files_restored}"
|
|
|
|
|
[imports_created, files_restored]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
attr_reader :user, :imports_data, :files_directory
|
|
|
|
|
|
|
|
|
|
def create_import_record(import_data)
|
|
|
|
|
import_attributes = prepare_import_attributes(import_data)
|
|
|
|
|
|
|
|
|
|
begin
|
2025-06-30 14:29:47 -04:00
|
|
|
import_record = user.imports.build(import_attributes)
|
|
|
|
|
import_record.skip_background_processing = true
|
|
|
|
|
import_record.save!
|
2025-06-28 06:22:56 -04:00
|
|
|
Rails.logger.debug "Created import: #{import_record.name}"
|
|
|
|
|
import_record
|
|
|
|
|
rescue ActiveRecord::RecordInvalid => e
|
|
|
|
|
Rails.logger.error "Failed to create import: #{e.message}"
|
|
|
|
|
nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def prepare_import_attributes(import_data)
|
|
|
|
|
import_data.except(
|
|
|
|
|
'file_name',
|
|
|
|
|
'original_filename',
|
|
|
|
|
'file_size',
|
|
|
|
|
'content_type',
|
|
|
|
|
'file_error',
|
|
|
|
|
'updated_at'
|
|
|
|
|
).merge(user: user)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def restore_import_file(import_record, import_data)
|
|
|
|
|
file_path = files_directory.join(import_data['file_name'])
|
|
|
|
|
|
|
|
|
|
unless File.exist?(file_path)
|
|
|
|
|
Rails.logger.warn "Import file not found: #{import_data['file_name']}"
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
import_record.file.attach(
|
|
|
|
|
io: File.open(file_path),
|
|
|
|
|
filename: import_data['original_filename'] || import_data['file_name'],
|
|
|
|
|
content_type: import_data['content_type'] || 'application/octet-stream'
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
Rails.logger.debug "Restored file for import: #{import_record.name}"
|
|
|
|
|
|
|
|
|
|
true
|
|
|
|
|
rescue StandardError => e
|
2025-06-30 16:51:25 -04:00
|
|
|
ExceptionReporter.call(e, 'Import file restoration failed')
|
2025-06-28 06:22:56 -04:00
|
|
|
|
|
|
|
|
false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|