ePages-de/beyond_api-ruby_client

View on GitHub
lib/beyond_api/utils.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

require "ostruct"

module BeyondApi
  module Utils
    extend self

    def file_content_type(file_path)
      case File.extname(file_path)
      when ".png"
        "image/png"
      when ".jpg", ".jpeg"
        "image/jpeg"
      when ".gif"
        "image/gif"
      end
    end

    def handle_all_request(url, resource, params = {})
      paginated_size = BeyondApi.configuration.all_pagination_size

      if params[:paginated] == false
        result = all_paginated(url, params.merge(page: 0, size: paginated_size))

        (1..result[:page][:total_pages] - 1).each do |page|
          result[:embedded][resource].concat(
            all_paginated(url,
                          params.merge(page: page,
                                       size: paginated_size))[:embedded][resource]
          )
        end

        result[:page][:size] = result[:page][:total_elements]
        result[:page][:total_pages] = 1
        result[:page][:number] = 0

        result
      else
        all_paginated(url, params)
      end
    end

    def handle_error(response, status)
      BeyondApi.logger.error "[Beyond API] #{status}: #{response}"
      error = BeyondApi::Error.new(response, status)
      BeyondApi.configuration.raise_error_requests ? raise(error) : error
    end

    def handle_response(response, status, respond_with_true: false)
      if status.between?(200, 299)
        return true if respond_with_true

        response = sanitize_response(response)
        BeyondApi.configuration.object_struct_responses ? to_object_struct(response) : response
      else
        handle_error(response, status)
      end
    end

    def sanitize_key(key)
      key.chars.first == "_" ? key[1..-1] : key
    end

    def sanitize_response(hash)
      {}.tap do |h|
        hash.each do |key, value|
          next if key == "_links" && BeyondApi.configuration.remove_response_links

          key = sanitize_key(key) if BeyondApi.configuration.remove_response_key_underscores
          h[key.underscore.to_sym] = transform(value)
        end
      end
    end

    def to_object_struct(data)
      if data.is_a? Hash
        OpenStruct.new(data.map { |key, val| [key, to_object_struct(val)] }.to_h)
      elsif data.is_a? Array
        data.map { |o| to_object_struct(o) }
      else
        data
      end
    end

    private

    def all_paginated(url, params = {})
      response, status = BeyondApi::Request.get(@session, url, params)

      handle_response(response, status)
    end

    def transform(thing)
      case thing
      when Hash then sanitize_response(thing)
      when Array then thing.map { |v| transform(v) }
      else; thing
      end
    end
  end
end