Class: Spree::SampleData::ImportRunner

Inherits:
Object
  • Object
show all
Includes:
Spree::ServiceModule::Base
Defined in:
app/services/spree/sample_data/import_runner.rb

Instance Method Summary collapse

Methods included from Spree::ServiceModule::Base

prepended

Instance Method Details

#call(csv_path:, import_class:) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'app/services/spree/sample_data/import_runner.rb', line 8

def call(csv_path:, import_class:)
  store = Spree::Store.default
  admin = Spree.admin_user_class.first

  raise 'No admin user found. Please run seeds first.' unless admin

  import = import_class.new(
    owner: store,
    user: admin
  )
  import.number = import.generate_permalink(import_class)
  import.attachment.attach(
    io: File.open(csv_path),
    filename: File.basename(csv_path),
    content_type: 'text/csv'
  )
  import.save!(validate: false)
  import.update_columns(status: 'processing')
  import.create_mappings

  row_number = 0
  failed = 0

  ::CSV.foreach(csv_path, headers: true) do |csv_row|
    row_number += 1
    import_row = import.rows.create!(
      row_number: row_number,
      data: csv_row.to_h.to_json,
      status: 'pending'
    )

    begin
      import_row.process!
    rescue StandardError => e
      failed += 1
      puts "\n  Warning: Row #{row_number} failed: #{e.message}"
    end

    print '.' if (row_number % 10).zero?
  end

  import.update!(status: 'completed')
  puts "\n  Processed #{row_number} rows (#{failed} failed)"
end