dawarich/app/services/users/import_data/imports.rb
2025-06-30 22:51:25 +02:00

100 lines
2.6 KiB
Ruby

# 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
import_record = user.imports.build(import_attributes)
import_record.skip_background_processing = true
import_record.save!
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
ExceptionReporter.call(e, 'Import file restoration failed')
false
end
end
end