lulibrary/puree

View on GitHub
lib/puree/rest/base.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'http'

module Puree

  module REST

    # Requests for a resource
    #
    class Base

      # @param config [Hash]
      # @option config [String] :url URL of the Pure host
      # @option config [String] :username Username of the Pure host account
      # @option config [String] :password Password of the Pure host account
      # @option config [String] :api_key API key of the Pure host account
      # @option config [Float] :http_read_timeout Read timeout in seconds
      # @option config [Float] :http_write_timeout Write timeout in seconds
      # @option config [Float] :http_connection_timeout Connection timeout in seconds
      def initialize(config)
        config = http_defaults.merge config
        @http_client = HTTP::Client.new
        if config[:username] || config[:password]
          options = {}
          options[:user] = config[:username]
          options[:pass] = config[:password]
          @http_client = @http_client.basic_auth options
        end
        @http_client = @http_client.headers(api_key_header(config[:api_key]))
        @http_client = @http_client.timeout read: config[:http_read_timeout],
                                            write: config[:http_write_timeout],
                                            connect: config[:http_connection_timeout]
        @url = config[:url]
      end

      # @param params [Hash] Combined GET and POST parameters for all records
      # @param accept [Symbol]
      # @return [HTTP::Response]
      def all_complex(params: {}, accept: :xml)
        post_request_collection params: params,
                                accept: accept
      end

      # @param params [Hash] GET parameters for all records
      # @param accept [Symbol]
      # @return [HTTP::Response]
      def all(params: {}, accept: :xml)
        get_request_collection params: params,
                               accept: accept
      end

      # @param id [String]
      # @param params [Hash]
      # @param accept [Symbol]
      # @return [HTTP::Response]
      def find(id:, params: {}, accept: :xml)
        get_request_singleton id: id,
                          params: params,
                          accept: accept
      end

      # @param accept [Symbol]
      # @return (see Puree::REST::Base#all)
      def orderings(accept: :xml)
        get_request_meta meta_type: 'orderings',
                     accept: accept
      end

      # @param accept [Symbol]
      # @return (see Puree::REST::Base#all)
      def renderings(accept: :xml)
        get_request_meta meta_type: 'renderings',
                     accept: accept
      end

      private

      def http_defaults
        {
          http_read_timeout: 10,
          http_write_timeout: 10,
          http_connection_timeout: 10
        }
      end

      def accept_header(accept)
        case accept
          when :json
            return { 'Accept' => 'application/json' }
          when :xml
            return { 'Accept' => 'application/xml' }
        end
      end

      def content_type_header(content_type)
        case content_type
        when :json
          return { 'Content-Type' => 'application/json' }
        when :xml
          return { 'Content-Type' => 'application/xml' }
        end
      end

      def api_key_header(key)
        msg = 'API key incomplete in configuration'
        raise msg if !key
        { 'api-key' => key }
      end

      def url_collection
        File.join @url, collection
      end

      def url_collection_subcollection(subcollection)
        File.join url_collection, subcollection
      end

      def url_singleton(id)
        File.join url_collection, id
      end

      def url_singleton_subcollection(id, subcollection)
        File.join url_singleton(id), subcollection
      end

      def meta(type)
        File.join "#{url_collection}-meta", type
      end

      # @return (see Puree::REST::Base#all_complex)
      def post_request_collection(params: {}, accept: :xml)
        @http_client = @http_client.headers(accept_header(accept))
        @http_client = @http_client.headers(content_type_header(:json))
        @http_client.post url_collection, json: params
      end

      # @return (see Puree::REST::Base#all)
      def get_request_collection(params: {}, accept: :xml)
        @http_client = @http_client.headers(accept_header(accept))
        @http_client.get url_collection, params: params
      end

      # @return (see Puree::REST::Base#all)
      def get_request_collection_subcollection(subcollection:, params: {}, accept: :xml)
        @http_client = @http_client.headers(accept_header(accept))
        @http_client.get url_collection_subcollection(subcollection), params: params
      end

      # @return (see Puree::REST::Base#all)
      def get_request_singleton(id:, params: {}, accept: :xml)
        @http_client = @http_client.headers(accept_header(accept))
        @http_client.get url_singleton(id), params: params
      end

      # @return (see Puree::REST::Base#all)
      def get_request_singleton_subcollection(id:, subcollection:, params: {}, accept: :xml)
        @http_client = @http_client.headers(accept_header(accept))
        @http_client.get url_singleton_subcollection(id, subcollection), params: params
      end

      # @return (see Puree::REST::Base#all)
      def get_request_meta(meta_type:, accept: :xml)
        @http_client = @http_client.headers(accept_header(accept))
        @http_client.get meta(meta_type)
      end

    end

  end

end