Sha256: 53478c910e99cc42529cdb5c73be1e000b1375336536102e98b69c8c1d820fce

Contents?: true

Size: 1.68 KB

Versions: 36

Compression:

Stored size: 1.68 KB

Contents

module Acfs

  # @api private
  #
  # Describes a CRUD operation. Handle request creation and response
  # processing as well as error handling and stubbing.
  #
  class Operation
    attr_reader :action, :params, :resource, :data, :callback
    delegate :service, to: :resource

    def initialize(resource, action, opts = {}, &block)
      @resource = resource
      @action   = action.to_sym
      @params   = opts[:params] || {}
      @data     = opts[:data]   || {}
      @callback = block

      raise ArgumentError, 'ID parameter required for READ, UPDATE and DELETE operation.' if single? and id.nil?
    end

    def single?
      [:read, :update, :delete].include? action
    end

    def synchronous?
      [:update, :delete, :create].include? action
    end

    def id
      @id ||= params.delete(:id) || data[:id]
    end

    def full_params
      id ? params.merge(id: id) : params
    end

    def url
      single? ? resource.url(id) : resource.url
    end

    def method
      { read: :get, list: :get, update: :put, create: :post, delete: :delete }[action]
    end

    def request
      request = ::Acfs::Request.new url, method: method, params: params, data: data
      request.on_complete do |response|
        handle_failure response unless response.success?
        callback.call response.data
      end
      request
    end

    def handle_failure(response)
      case response.code
        when 404
          raise ::Acfs::ResourceNotFound.new response: response
        when 422
          raise ::Acfs::InvalidResource.new response: response, errors: response.data.try(:[], 'errors')
        else
          raise ::Acfs::ErroneousResponse.new response: response
      end
    end
  end
end

Version data entries

36 entries across 36 versions & 1 rubygems

Version Path
acfs-0.23.2.b208 lib/acfs/operation.rb
acfs-0.23.2.b206 lib/acfs/operation.rb
acfs-0.23.2.b205 lib/acfs/operation.rb
acfs-0.23.2.b204 lib/acfs/operation.rb
acfs-0.23.2.b203 lib/acfs/operation.rb
acfs-0.23.2.b200 lib/acfs/operation.rb
acfs-0.23.2.b199 lib/acfs/operation.rb
acfs-0.23.2 lib/acfs/operation.rb
acfs-0.23.1.b198 lib/acfs/operation.rb
acfs-0.23.1 lib/acfs/operation.rb
acfs-0.23.0.b197 lib/acfs/operation.rb
acfs-0.22.2.b196 lib/acfs/operation.rb
acfs-0.23.0 lib/acfs/operation.rb
acfs-0.22.2.b194 lib/acfs/operation.rb
acfs-0.22.2.b193 lib/acfs/operation.rb
acfs-0.22.2 lib/acfs/operation.rb
acfs-0.22.1.b192 lib/acfs/operation.rb
acfs-0.22.1 lib/acfs/operation.rb
acfs-0.22.0.b191 lib/acfs/operation.rb
acfs-0.22.0.b190 lib/acfs/operation.rb