lib/intercom-rails/import.rb in intercom-rails-0.2.17 vs lib/intercom-rails/import.rb in intercom-rails-0.2.18

- old
+ new

@@ -31,15 +31,28 @@ http.ca_file = File.join(File.dirname(__FILE__), '../data/cacert.pem') http.verify_mode = OpenSSL::SSL::VERIFY_PEER end end + # Check for ActiveRecord OR Mongoid + def active_record?(user_klass) + (defined?(ActiveRecord::Base) && (user_klass < ActiveRecord::Base)) + end + + def mongoid?(user_klass) + (defined?(Mongoid::Document) && (user_klass < Mongoid::Document)) + end + + def supported_orm?(user_klass) + active_record?(user_klass) || mongoid?(user_klass) + end + def assert_runnable raise ImportError, "You can only import your users from your production environment" unless Rails.env.production? raise ImportError, "We couldn't find your user class, please set one in config/initializers/intercom_rails.rb" unless user_klass.present? info "Found user class: #{user_klass}" - raise ImportError, "Only ActiveRecord models are supported" unless defined?(ActiveRecord::Base) && (user_klass < ActiveRecord::Base) + raise ImportError, "Only ActiveRecord and Mongoid models are supported" unless supported_orm?(user_klass) raise ImportError, "Please add an Intercom API Key to config/initializers/intercom.rb" unless IntercomRails.config.api_key.present? info "Intercom API key found" end def run @@ -65,23 +78,34 @@ end private MAX_BATCH_SIZE = 100 def batches - user_klass.find_in_batches(:batch_size => MAX_BATCH_SIZE) do |users| - users_for_wire = users.map do |u| - user_proxy = Proxy::User.new(u) - next unless user_proxy.valid? - - for_wire = user_proxy.to_hash - companies = Proxy::Company.companies_for_user(user_proxy) - for_wire.merge!(:companies => companies.map(&:to_hash)) if companies.present? + if active_record?(user_klass) + user_klass.find_in_batches(:batch_size => MAX_BATCH_SIZE) do |users| + users_for_wire = map_to_users_for_wire(users) - for_wire - end.compact - - yield(prepare_batch(users_for_wire), users_for_wire.count) unless users_for_wire.count.zero? + yield(prepare_batch(users_for_wire), users_for_wire.count) unless users_for_wire.count.zero? + end + elsif mongoid?(user_klass) + 0.step(user_klass.all.count, MAX_BATCH_SIZE) do |offset| + users_for_wire = map_to_users_for_wire(user_klass.limit(MAX_BATCH_SIZE).skip(offset)) + yield(prepare_batch(users_for_wire), users_for_wire.count) unless users_for_wire.count.zero? + end end + end + + def map_to_users_for_wire(users) + users.map do |u| + user_proxy = Proxy::User.new(u) + next unless user_proxy.valid? + + for_wire = user_proxy.to_hash + companies = Proxy::Company.companies_for_user(user_proxy) + for_wire.merge!(:companies => companies.map(&:to_hash)) if companies.present? + + for_wire + end.compact end def prepare_batch(batch) {:users => batch}.to_json end