coryodaniel/munson

View on GitHub
lib/munson/agent.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Munson
  class Agent
    # Creates a new Munson::Agent
    #
    # @param [#to_s] path to JSON API Resource. Path will be added to the base path set in the Faraday::Connection
    # @param [Munson::Connection] connection to use
    def initialize(path, connection: nil)
      @path       = path
      @connection = connection
    end

    # Connection that will be used for HTTP requests
    #
    # @return [Munson::Connection] current connection of Munson::Agent or Munson.default_connection if not set
    def connection
      return @connection if @connection
      Munson.default_connection
    end

    # JSON API Spec GET request
    #
    # @option [Hash,nil] params: nil query params
    # @option [String] path: nil path to GET, defaults to Faraday::Connection url + Agent#default_path
    # @option [Hash] headers: nil HTTP Headers
    # @option [String,Fixnum] id: nil ID to append to @path (provided in #new) when accessing a resource. If :path and :id are both specified, :path wins
    # @return [Faraday::Response]
    def get(params: nil, path: nil, headers: nil, id: nil)
      connection.get(
        path: negotiate_path(path, id),
        params: params,
        headers: headers
      )
    end

    def negotiate_path(path = nil, id = nil)
      if path
        path
      elsif id
        [@path, id].join('/')
      else
        @path
      end
    end

    # JSON API Spec POST request
    #
    # @option [Hash,nil] body: {} query params
    # @option [String] path: nil path to GET, defaults to Faraday::Connection url + Agent#default_path
    # @option [Hash] headers: nil HTTP Headers
    # @option [Type] http_method: :post describe http_method: :post
    # @option [String,Fixnum] id: nil ID to append to default path when accessing a resource. If :path and :id are both specified, :path wins
    # @return [Faraday::Response]
    def post(body: {}, path: nil, headers: nil, http_method: :post, id: nil)
      connection.post(
        path: negotiate_path(path, id),
        body: body,
        headers: headers,
        http_method: http_method
      )
    end

    # JSON API Spec PATCH request
    #
    # @option [Hash,nil] body: nil query params
    # @option [String] path: nil path to GET, defaults to Faraday::Connection url + Agent#default_path
    # @option [Hash] headers: nil HTTP Headers
    # @option [String,Fixnum] id: nil ID to append to default path when accessing a resource. If :path and :id are both specified, :path wins
    # @return [Faraday::Response]
    def patch(body: nil, path: nil, headers: nil, id: nil)
      post(body: body, path: path, headers: headers, http_method: :patch, id: id)
    end

    # JSON API Spec PUT request
    #
    # @option [Hash,nil] body: nil query params
    # @option [String] path: nil path to GET, defaults to Faraday::Connection url + Agent#default_path
    # @option [Hash] headers: nil HTTP Headers
    # @option [String,Fixnum] id: nil ID to append to default path when accessing a resource. If :path and :id are both specified, :path wins
    # @return [Faraday::Response]
    def put(body: nil, path: nil, headers: nil, id: nil)
      post(body: body, path: path, headers: headers, http_method: :put, id: id)
    end

    # JSON API Spec DELETE request
    #
    # @option [Hash,nil] body: nil query params
    # @option [String] path: nil path to GET, defaults to Faraday::Connection url + Agent#default_path
    # @option [Hash] headers: nil HTTP Headers
    # @option [String,Fixnum] id: nil ID to append to default path when accessing a resource. If :path and :id are both specified, :path wins
    # @return [Faraday::Response]
    def delete(body: nil, path: nil, headers: nil, id: nil)
      post(body: body, path: path, headers: headers, http_method: :delete, id: id)
    end
  end
end