Class: DeviseCastle::Import

Inherits:
Object
  • Object
show all
Defined in:
lib/devise_castle/import.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Import

Returns a new instance of Import.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/devise_castle/import.rb', line 7

def initialize(options = {})
  begin
    @resource_class = eval(options[:resource_class])
  rescue NameError
    raise ImportError, "No such class: #{options[:resource_class]}"
  end

  unless supported_orm?
    raise ImportError, "Only ActiveRecord and Mongoid models are supported"
  end

  unless Castle.config.api_secret.present?
    raise ImportError, "Please add an Castle API secret to your devise.rb"
  end

  @batch_size = [(options[:batch_size] || 100), 100].min
end

Instance Attribute Details

#batch_sizeObject (readonly)

Returns the value of attribute batch_size.



5
6
7
# File 'lib/devise_castle/import.rb', line 5

def batch_size
  @batch_size
end

#resource_classObject (readonly)

Returns the value of attribute resource_class.



5
6
7
# File 'lib/devise_castle/import.rb', line 5

def resource_class
  @resource_class
end

Class Method Details

.run(*args) ⇒ Object



25
26
27
# File 'lib/devise_castle/import.rb', line 25

def self.run(*args)
  new(*args).run
end

Instance Method Details

#active_record?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/devise_castle/import.rb', line 72

def active_record?
  (defined?(ActiveRecord::Base) && (resource_class < ActiveRecord::Base))
end

#batchesObject



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/devise_castle/import.rb', line 44

def batches
  if active_record?
    resource_class.where("castle_id IS NULL").find_in_batches(:batch_size => batch_size) do |resources|
      resources_for_wire = map_resources_to_castle_format(resources)
      yield(resources_for_wire, resources) unless resources.count.zero?
    end
  elsif mongoid?
    0.step(resource_class.where(:castle_id => nil).count, batch_size) do |offset|
      resources_for_wire = map_resources_to_castle_format(resource_class.limit(batch_size).skip(offset))
      yield(resources_for_wire, resources) unless resources.count.zero?
    end
  end
end

#map_resources_to_castle_format(resources) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/devise_castle/import.rb', line 58

def map_resources_to_castle_format(resources)
  resources.map do |resource|
    format = {}
    format[:email] = resource.email unless resource.email.blank?
    format[:id] = resource._castle_id
    format[:created_at] = resource.created_at if resource.respond_to? :created_at
    format
  end.compact
end

#mongoid?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/devise_castle/import.rb', line 76

def mongoid?
  (defined?(Mongoid::Document) && (resource_class < Mongoid::Document))
end

#prepare_batch(batch) ⇒ Object



68
69
70
# File 'lib/devise_castle/import.rb', line 68

def prepare_batch(batch)
  { :users => batch }.to_json
end

#runObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/devise_castle/import.rb', line 29

def run
  batches do |batch, resources|
    begin
      users = Castle::User.import(users: batch)
    rescue Castle::Error => error
      raise ImportError, error.message
    end

    users.zip(resources).each do |user, resource|
      resource.castle_id = user.id
      resource.save(validate: false)
    end
  end
end

#supported_orm?Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/devise_castle/import.rb', line 80

def supported_orm?
  active_record? || mongoid?
end