Sha256: 42513238652bbf991adfc3ff98e2d67deaf8c80e56a6528e38e246b6213fcdee

Contents?: true

Size: 1.76 KB

Versions: 7

Compression:

Stored size: 1.76 KB

Contents

module Dolly
  class BulkDocument
    extend Forwardable

    DOC_NAME = '_bulk_docs'

    attr_reader :payload, :connection
    attr_accessor :errors, :response

    def_delegators :docs, :[], :<<

    def initialize(connection, ary = [])
      @connection = connection
      @payload = Hash.new
      payload[:docs] = ary
    end

    def docs
      payload[:docs]
    end

    def save
      return if docs.empty?
      self.response = connection.post(DOC_NAME, docs_payload)
      build_errors
      update_revs
    end

    def delete
      return if docs.empty?
      connection.post DOC_NAME, json_payload(_deleted: true)
    end

    def clear
      self.payload[:docs] = []
      self.response = []
      self.errors = []
    end

    def with_errors?
      response_errors.present?
    end

    private

    def update_revs
      response.each do |doc|
        next if doc[:error]
        item = payload[:docs].detect { |d| d.id == doc[:id] }

        if item.nil?
          errors << response_error(item)
          next
        end

        item.rev = doc[:rev]
        payload[:docs].delete(item)
      end

      clean_response
    end

    def clean_response
      response.delete_if { |d| !d[:error] }
    end

    def build_errors
      self.errors = response_errors.map do |err|
        obj = payload[:docs].detect { |d| d.id == err[:id]} if err[:id]
        BulkError.new err.merge!(obj: obj)
      end
    end

    def docs_payload opts = {}
      { docs: docs.map {|d| d.to_h.merge(opts) } }
    end

    def response_errors
      self.response.select{ |d| d[:error] }
    end

    def response_error(item)
      BulkError.new(error: 'Document saved but not local rev updated.', reason: "Document with id #{item} on bulk doc was not found in payload.", obj: nil)
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
dolly-3.1.5 lib/dolly/bulk_document.rb
dolly-3.1.4 lib/dolly/bulk_document.rb
dolly-3.1.3 lib/dolly/bulk_document.rb
dolly-3.1.2 lib/dolly/bulk_document.rb
dolly-3.1.1 lib/dolly/bulk_document.rb
dolly-3.1.0 lib/dolly/bulk_document.rb
dolly-3.0.1 lib/dolly/bulk_document.rb