ManageIQ/manageiq-api

View on GitHub
app/controllers/api/base_controller/parameters.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
module Api
  class BaseController
    module Parameters
      module ResultsController
        def sort_order
          %w[desc descending].include?(params['sort_order']) ? :descending : :ascending
        end

        def param_result_set?
          params.key?(:hash_attribute) && params[:hash_attribute] == "result_set"
        end

        def report_options
          params.merge(:sort_order => sort_order)
        end
      end

      def hash_fetch(hash, element, default = {})
        hash[element] || default
      end

      #
      # Returns an MiqExpression based on the filter attributes specified.
      #
      def filter_param(klass)
        return nil if params['filter'].blank?
        Filter.parse(params["filter"], klass)
      end

      def by_tag_param
        params['by_tag']
      end

      def search_options
        params['search_options'].to_s.split(",")
      end

      def search_option?(what)
        search_options.map(&:downcase).include?(what.to_s)
      end

      def format_attributes
        params['format_attributes'].to_s.split(",").map { |af| af.split("=").map(&:strip) }
      end

      def attribute_format(attr)
        format_attributes.detect { |af| af.first == attr }.try(:second)
      end

      def attribute_selection
        if @req.attributes.empty? && @additional_attributes
          Array(@additional_attributes) | ID_ATTRS
        elsif !@req.attributes.empty?
          @req.attributes | ID_ATTRS
        else
          "all"
        end
      end

      def attribute_selection_for(collection)
        Array(attribute_selection).collect do |attr|
          /\A#{collection}\.(?<name>.*)\z/.match(attr) { |m| m[:name] }
        end.compact
      end

      def render_attr(attr)
        as = attribute_selection
        as == "all" || as.include?(attr)
      end

      #
      # Returns the ActiveRecord's option for :order
      #
      # i.e. ['attr1 [asc|desc]', 'attr2 [asc|desc]', ...]
      #
      def sort_params(klass)
        return [] if params['sort_by'].blank?

        orders = String(params['sort_order']).split(",")
        options = String(params['sort_options']).split(",")
        params['sort_by'].split(",").zip(orders).collect do |attr, order|
          if klass.virtual_attribute?(attr) && !klass.attribute_supported_by_sql?(attr)
            raise BadRequestError, "#{klass.name} cannot be sorted by #{attr}"
          elsif klass.attribute_supported_by_sql?(attr)
            sort_directive(klass, attr, order, options)
          else
            raise BadRequestError, "#{attr} is not a valid attribute for #{klass.name}"
          end
        end.compact
      end

      def sort_directive(klass, attr, order, options)
        arel = klass.arel_table[attr]
        if order
          arel = arel.lower if options.map(&:downcase).include?("ignore_case")
          arel = %w[desc descending].include?(order.downcase) ? arel.desc : arel.asc
        else
          arel = arel.asc
        end
        arel
      end
    end
  end
end