master
 1class UploadStrongliftsBackupJob < ApplicationJob
 2  queue_as :default
 3
 4  def perform(user, backup_file, program)
 5    tmp_dir do |dir|
 6      if extract!(backup_file, dir)
 7        importer_for(dir, user, program).import_from(dir)
 8      end
 9    end
10  end
11
12  private
13
14  def tmp_dir
15    Dir.mktmpdir do |dir|
16      yield dir
17    end
18  end
19
20  def importer_for(directory, user, program)
21    [
22      Csv::Import.new(user, program),
23      UnknownFile.new
24    ].detect { |x| x.can_parse?(directory) }
25  end
26
27  def extract!(backup_file, dir)
28    # `unzip #{backup_file} -d #{dir}`
29    extension = File.extname(backup_file)
30    if extension.eql?(".stronglifts")
31      Zip::File.open(backup_file) do |zip_file|
32        zip_file.each do |entry|
33          entry.extract(File.join(dir, entry.name))
34        end
35      end
36    else
37      `cp #{backup_file} #{dir}`
38    end
39    true
40  rescue StandardError => error
41    Rails.logger.error("#{error.message} #{error.backtrace.join(' ')}")
42    false
43  end
44
45  class UnknownFile
46    def can_parse?(_directory)
47      true
48    end
49
50    def import_from(_directory)
51    end
52  end
53end