Sha256: b61e4be0743a4bddd35d26bfd0e5179b52dcab28df1fe0413405526e629b90ae

Contents?: true

Size: 1.8 KB

Versions: 21

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

module Decidim
  module Budgets
    # This class handles search and filtering of projects. Needs a
    # `current_component` param with a `Decidim::Component` in order to
    # find the projects.
    class ProjectSearch < ResourceSearch
      # Public: Initializes the service.
      # component     - A Decidim::Component to get the projects from.
      def initialize(options = {})
        super(Project.all, options)
        @random_seed = options[:random_seed].to_f
      end

      # Handle the search_text filter
      def search_search_text
        query
          .where(localized_search_text_in(:title), text: "%#{search_text}%")
          .or(query.where(localized_search_text_in(:description), text: "%#{search_text}%"))
      end

      # Returns the random projects for the current page.
      def results
        @results ||= Project.transaction do
          Project.connection.execute("SELECT setseed(#{Project.connection.quote(random_seed)})")
          super.reorder(Arel.sql("RANDOM()")).load
        end
      end

      # Returns the random seed used to randomize the proposals.
      def random_seed
        @random_seed = (rand * 2 - 1) if @random_seed == 0.0 || @random_seed > 1 || @random_seed < -1
        @random_seed
      end

      private

      # Internal: builds the needed query to search for a text in the organization's
      # available locales. Note that it is intended to be used as follows:
      #
      # Example:
      #   Resource.where(localized_search_text_for(:title, text: "my_query"))
      #
      # The Hash with the `:text` key is required or it won't work.
      def localized_search_text_in(field)
        options[:organization].available_locales.map do |l|
          "#{field} ->> '#{l}' ILIKE :text"
        end.join(" OR ")
      end
    end
  end
end

Version data entries

21 entries across 21 versions & 1 rubygems

Version Path
decidim-budgets-0.18.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.17.2 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.18.0 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.17.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.16.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.17.0 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.16.0 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.15.2 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.15.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.15.0 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.14.4 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.14.3 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.14.2 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.14.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.13.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.12.2 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.13.0 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.12.1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.13.0.pre1 app/services/decidim/budgets/project_search.rb
decidim-budgets-0.12.0 app/services/decidim/budgets/project_search.rb