Kentico/delivery-sdk-ruby

View on GitHub
lib/delivery/builders/url_builder.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Kontent
  module Ai
    module Delivery
      module Builders
        # Internal class which generates the URL required for Delivery REST API
        class UrlBuilder
          URL_TEMPLATE_BASE = 'https://deliver.kontent.ai/%s'.freeze
          URL_TEMPLATE_PREVIEW = 'https://preview-deliver.kontent.ai/%s'.freeze
          URL_TEMPLATE_ITEM = '/items/%s'.freeze
          URL_TEMPLATE_ITEMS = '/items'.freeze
          URL_TEMPLATE_TYPE = '/types/%s'.freeze
          URL_TEMPLATE_TYPES = '/types'.freeze
          URL_TEMPLATE_ELEMENTS = '/types/%s/elements/%s'.freeze
          URL_TEMPLATE_TAXONOMY = '/taxonomies/%s'.freeze
          URL_TEMPLATE_TAXONOMIES = '/taxonomies'.freeze
          URL_TEMPLATE_ITEMS_FEED = '/items-feed'.freeze
          URL_TEMPLATE_LANGUAGES = '/languages'.freeze

          URL_MAX_LENGTH = 65_519
          MSG_LONG_QUERY = 'The request url is too long. Split your query into multiple calls.'.freeze

          class << self
            # Returns the proper domain for the request along with the
            # query string parameters configured by the +DeliveryQuery+.
            #
            # * *Args*:
            #   - *query* ( Kontent::Ai::Delivery::DeliveryQuery )
            #
            # * *Returns*:
            #   - +string+ The full URL for a Delivery request
            def provide_url(query)
              url = provide_base_url(query)
              url += provide_path_part(query)

              if query.query_string.empty?
                url
              else
                url + query.query_string.to_s
              end
            end

            # Checks whether the provided URL is too long and raises an error if so.
            #
            # * *Args*:
            #   - *url* (+string+) A full Delivery URL
            #
            # * *Raises*:
            #   - +UriFormatException+ if the URL is 65,519 characters or more
            def validate_url(url)
              raise UriFormatException, MSG_LONG_QUERY if url.length > URL_MAX_LENGTH
            end

            private

            # Returns relative path part of URL depending on query type.
            #
            # * *Args*:
            #   - *query* ( Kontent::Ai::Delivery::DeliveryQuery )
            #
            # * *Returns*:
            #   - +string+ The URL path part (without protocol or domain)
            def provide_path_part(query)
              case query.query_type
              when Kontent::Ai::Delivery::QUERY_TYPE_ITEMS
                provide_item query
              when Kontent::Ai::Delivery::QUERY_TYPE_TYPES
                provide_type query
              when Kontent::Ai::Delivery::QUERY_TYPE_TAXONOMIES
                provide_taxonomy query
              when Kontent::Ai::Delivery::QUERY_TYPE_LANGUAGES
                URL_TEMPLATE_LANGUAGES
              when Kontent::Ai::Delivery::QUERY_TYPE_ELEMENT
                format(URL_TEMPLATE_ELEMENTS, query.content_type, query.code_name)
              when Kontent::Ai::Delivery::QUERY_TYPE_ITEMS_FEED
                URL_TEMPLATE_ITEMS_FEED
              end
            end

            def provide_item(query)
              if query.code_name.nil?
                URL_TEMPLATE_ITEMS
              else
                format(URL_TEMPLATE_ITEM, query.code_name)
              end
            end

            def provide_taxonomy(query)
              if query.code_name.nil?
                URL_TEMPLATE_TAXONOMIES
              else
                format(URL_TEMPLATE_TAXONOMY, query.code_name)
              end
            end

            def provide_type(query)
              if query.code_name.nil?
                URL_TEMPLATE_TYPES
              else
                format(URL_TEMPLATE_TYPE, query.code_name)
              end
            end

            # Returns the protocol and domain with project ID. Domain changes
            # according to the query's +use_preview+ attribute.
            #
            # * *Args*:
            #   - *query* ( Kontent::Ai::Delivery::DeliveryQuery )
            #
            # * *Returns*:
            #   - +string+ The URL with the project ID
            def provide_base_url(query)
              if query.use_preview
                format(URL_TEMPLATE_PREVIEW, query.project_id)
              else
                format(URL_TEMPLATE_BASE, query.project_id)
              end
            end
          end
        end
      end
    end
  end
end