Library-Distribution/ALD-sinatra

View on GitHub
helpers/data.rb

Summary

Maintainability
A
55 mins
Test Coverage
module ALD
  module SinatraHelpers
    module Data
      def restrict(data)
        if params[:count]
          data = data.limit(params[:count].to_i)
        end

        if params[:start]
          data = data.limit(data.count) unless params[:count] # there must be a limit for offset to work
          data = data.offset(params[:start].to_i)
        end

        data
      end

      def conditions(allowed_params)
        query = []
        data = []

        (allowed_params[:exact] || []).each do |param|
          if params[param]
            query << "#{param.to_s} = ?"
            data << params[param]
          end
        end

        (allowed_params[:range] || []).each do |param|
          { "min" => ">=", "max" => "<=" }.each_pair do |k, op|
            if params[:"#{param}-#{k}"]
              query << "#{param.to_s} #{op} ?"
              data << params[:"#{param}-#{k}"]
            end
          end
        end

        (allowed_params[:array] || []).each do |param|
          if params[param]
            params[param].split(",").each do |entry|
              query << "? = ANY (#{param})"
              data << entry
            end
          end
        end

        [query.join(" and ")].concat(data)
      end

      def sort(criteria)
        order = {}

        sort = (params[:sort] || '').split(',')
        sort.each do |param|
          dir = :asc
          if param[0] == '-'
            param = param[1..-1]
            dir = :desc
          end

          if criteria.include?(param)
            order[param] = dir
          end
        end

        order
      end
    end
  end
end

helpers ALD::SinatraHelpers::Data