mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-09 08:47:11 -05:00
68 lines
1.8 KiB
Ruby
68 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Users::ImportDataJob < ApplicationJob
|
|
queue_as :imports
|
|
|
|
sidekiq_options retry: false
|
|
|
|
def perform(import_id)
|
|
import = Import.find(import_id)
|
|
user = import.user
|
|
|
|
archive_path = download_import_archive(import)
|
|
|
|
unless File.exist?(archive_path)
|
|
raise StandardError, "Archive file not found: #{archive_path}"
|
|
end
|
|
|
|
import_stats = Users::ImportData.new(user, archive_path).import
|
|
|
|
User.reset_counters(user.id, :points)
|
|
|
|
Rails.logger.info "Import completed successfully for user #{user.email}: #{import_stats}"
|
|
rescue ActiveRecord::RecordNotFound => e
|
|
ExceptionReporter.call(e, "Import job failed for import_id #{import_id} - import not found")
|
|
|
|
raise e
|
|
rescue StandardError => e
|
|
user_id = user&.id || import&.user_id || 'unknown'
|
|
ExceptionReporter.call(e, "Import job failed for user #{user_id}")
|
|
|
|
create_import_failed_notification(user, e)
|
|
|
|
raise e
|
|
ensure
|
|
if archive_path && File.exist?(archive_path)
|
|
File.delete(archive_path)
|
|
|
|
Rails.logger.info "Cleaned up archive file: #{archive_path}"
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def download_import_archive(import)
|
|
require 'tmpdir'
|
|
|
|
timestamp = Time.current.to_i
|
|
filename = "user_import_#{import.user_id}_#{import.id}_#{timestamp}.zip"
|
|
temp_path = File.join(Dir.tmpdir, filename)
|
|
|
|
File.open(temp_path, 'wb') do |file_handle|
|
|
import.file.download do |chunk|
|
|
file_handle.write(chunk)
|
|
end
|
|
end
|
|
|
|
temp_path
|
|
end
|
|
|
|
def create_import_failed_notification(user, error)
|
|
::Notifications::Create.new(
|
|
user: user,
|
|
title: 'Data import failed',
|
|
content: "Your data import failed with error: #{error.message}. Please check the archive format and try again.",
|
|
kind: :error
|
|
).call
|
|
end
|
|
end
|