Sha256: a05f93f772d9f39916b70698a4ce005346713b78dd50dbeea23f6ebe54e9a9b8

Contents?: true

Size: 1.85 KB

Versions: 16

Compression:

Stored size: 1.85 KB

Contents

module Workarea
  module Api
    module Admin
      class BulkUpsert
        include ApplicationDocument

        field :klass, type: String
        field :data, type: Array, default: []
        field :data_errors, type: Hash, default: {}
        field :started_at, type: DateTime
        field :completed_at, type: DateTime

        validates :data,
          presence: true,
          length: {
            maximum: Workarea.config.max_api_bulk_data_size,
            message: I18n.t('workarea.api.admin.bulk_upserts.data_too_large')
          }

        validate :model_validity

        def perform!
          update_attribute(:started_at, Time.now)

          data.each_with_index do |attrs, i|
            instance = find_updated_model_for(attrs)
            instance.save

            if instance.errors.present?
              data_errors[i.to_s] = instance.errors.as_json
            end
          end

          if data_errors.blank?
            destroy!
          else
            self.completed_at = Time.now
            save!(validate: false)
          end
        end

        def model_class
          @model_class ||= klass.constantize
        end

        private

        def model_validity
          data.each_with_index do |attrs, i|
            instance = find_updated_model_for(attrs)

            next if instance.valid?
            instance.errors.full_messages.each do |message|
              errors.add(i.to_s, message)
            end
          end
        end

        def find_updated_model_for(attrs)
          id = attrs['_id'].presence || attrs['id'].presence ||
                 attrs[:_id].presence || attrs[:id]

          if id.present?
            result = model_class.find_or_initialize_by(id: id)
            result.attributes = attrs
            result
          else
            model_class.new(attrs)
          end
        end
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 2 rubygems

Version Path
workarea-api-4.5.6 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.5.6 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.5.5 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.5.5 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.5.4 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.5.4 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.5.3 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.5.3 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.5.2 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.5.2 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.5.0 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.5.0 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.4.7 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.4.7 app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-4.4.6 admin/app/models/workarea/api/admin/bulk_upsert.rb
workarea-api-admin-4.4.6 app/models/workarea/api/admin/bulk_upsert.rb