dawarich/app/services/users/import_data/exports.rb

93 lines
2.4 KiB
Ruby
Raw Normal View History

2025-06-28 06:22:56 -04:00
# frozen_string_literal: true
class Users::ImportData::Exports
def initialize(user, exports_data, files_directory)
@user = user
@exports_data = exports_data
@files_directory = files_directory
end
def call
return [0, 0] unless exports_data.is_a?(Array)
Rails.logger.info "Importing #{exports_data.size} exports for user: #{user.email}"
exports_created = 0
files_restored = 0
exports_data.each do |export_data|
next unless export_data.is_a?(Hash)
# Check if export already exists (match by name and created_at)
existing_export = user.exports.find_by(
name: export_data['name'],
created_at: export_data['created_at']
)
if existing_export
Rails.logger.debug "Export already exists: #{export_data['name']}"
next
end
# Create new export
export_record = create_export_record(export_data)
exports_created += 1
# Restore file if present
if export_data['file_name'] && restore_export_file(export_record, export_data)
files_restored += 1
end
Rails.logger.debug "Created export: #{export_record.name}"
end
Rails.logger.info "Exports import completed. Created: #{exports_created}, Files: #{files_restored}"
[exports_created, files_restored]
end
private
attr_reader :user, :exports_data, :files_directory
def create_export_record(export_data)
export_attributes = prepare_export_attributes(export_data)
user.exports.create!(export_attributes)
end
def prepare_export_attributes(export_data)
export_data.except(
'file_name',
'original_filename',
'file_size',
'content_type',
'file_error'
).merge(user: user)
end
def restore_export_file(export_record, export_data)
file_path = files_directory.join(export_data['file_name'])
unless File.exist?(file_path)
Rails.logger.warn "Export file not found: #{export_data['file_name']}"
return false
end
begin
# Attach the file to the export record
export_record.file.attach(
io: File.open(file_path),
filename: export_data['original_filename'] || export_data['file_name'],
content_type: export_data['content_type'] || 'application/octet-stream'
)
Rails.logger.debug "Restored file for export: #{export_record.name}"
true
rescue StandardError => e
ExceptionReporter.call(e, "Export file restoration failed")
false
end
end
end