ophrescue/RescueRails

View on GitHub
app/models/user_searcher.rb

Summary

Maintainability
A
25 mins
Test Coverage
class UserSearcher
  PER_PAGE = 200
  EMAIL_CHECK = /\A([\w+\-].?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

  def initialize(params: {})
    @params = params
  end

  def search
    @users = User

    if text_search?
      if email_search?
        @users = @users.where('lower(email) LIKE ?', "%#{search_term}%")
      else
        @users = @users.where('lower(name) LIKE ?', "%#{search_term}%")
      end
    elsif location_search?
      @users = @users.filter_class(filtering_params).near(@params[:location], @params[:range])
    else
      @params[:location] = nil
      @params[:range] = nil
      @users = @users.unlocked.filter_class(filtering_params).order('name')
    end

    for_page(@params[:page])

    @users
  end

  def self.search(params: {})
    new(params: params).search
  end

  private

  def text_search?
    @params[:search].present?
  end

  def email_search?
    @params[:search].match(EMAIL_CHECK)
  end

  def location_search?
    @params[:location].present? && @params[:range].present? && @params[:range].to_i.between?(1,30)
  end

  def search_term
    @params[:search].to_s.downcase.strip
  end

  def for_page(page = nil)
    @users = @users.paginate(per_page: PER_PAGE, page: page || 1)
  end

  def filtering_params
    @params.slice(:admin, :adoption_coordinator, :event_planner,
                 :dog_adder, :dog_editor, :photographer, :foster,
                 :newsletter, :clerical, :has_dogs, :has_cats, :house_type, :has_children, :has_children_under_five,
                 :has_fence, :puppies_ok, :dogs_ok, :cats_ok, :has_parvo_house, :transporter, :training_team,
                 :foster_mentor, :translator, :public_relations, :fundraising, :medical_behavior,
                 :boarding_buddy, :foster_friend, :social_media, :graphic_designer, :active_volunteer, :inactive_volunteer,
                 :available_to_foster, :locked, :unlocked
                )
  end
end