rapidftr/RapidFTR

View on GitHub
app/models/forms/search_form.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Forms
  class SearchForm
    PER_PAGE = 20
    SYSTEM_CRITERIA = [:created_by_organisation_value, :created_by_value, :updated_by_value, :created_at_before_value, :created_at_after_value, :updated_at_before_value, :updated_at_after_value]

    include ActiveModel::Model
    include ActiveModel::Validations::Callbacks

    attr_accessor :ability, :params
    attr_reader :criteria, :system_criteria, :query, :results

    before_validation :parse_params
    validate :has_criteria?

    def execute
      execute_search if valid?
      self
    end

    private

    def parse_params
      criteria_hash = params[:criteria_list] || {}
      criteria_list = criteria_hash.is_a?(Hash) ? criteria_hash.values : criteria_hash

      @criteria = criteria_list.select do |criterion|
        criterion[:value].present? && criterion[:field].present?
      end

      @system_criteria = params.slice(*SYSTEM_CRITERIA).select { |_k, v| v.present? }

      @query = params[:query]
    end

    def has_criteria?
      errors.add(:criteria, I18n.t('messages.valid_search_criteria')) unless @criteria.present? || @system_criteria.present? || @query.present?
    end

    def execute_search
      search = Search.for(Child)

      @criteria.each do |criterion|
        search.fulltext_by [criterion[:field]], criterion[:value]
      end if criteria.count > 0

      search.fulltext_by([:created_organisation], @system_criteria[:created_by_organisation_value]) if @system_criteria[:created_by_organisation_value].present?
      search.fulltext_by([:created_by, :created_by_full_name], @system_criteria[:created_by_value]) if @system_criteria[:created_by_value].present?
      search.fulltext_by([:last_updated_by, :last_updated_by_full_name], @system_criteria[:updated_by_value]) if @system_criteria[:updated_by_value].present?

      search.less_than(:created_at, @system_criteria[:created_at_before_value]) if @system_criteria[:created_at_before_value].present?
      search.greater_than(:created_at, @system_criteria[:created_at_after_value]) if @system_criteria[:created_at_after_value].present?
      search.less_than(:last_updated_at, @system_criteria[:updated_at_before_value]) if @system_criteria[:updated_at_before_value].present?
      search.greater_than(:last_updated_at, @system_criteria[:updated_at_after_value]) if @system_criteria[:updated_at_after_value].present?

      search.fulltext_by((Form.find_by_name(Child::FORM_NAME).highlighted_fields.map(&:name)) + [:unique_identifier, :short_id], @query) if @query.present?

      search.created_by(ability.user) unless ability.can?(:view_all, Child)
      search.paginated((params[:page] || 1).to_i, (params[:per_page] || PER_PAGE).to_i)

      @results = search.results
    end
  end
end