Class: Decidim::Initiatives::InitiativeSearch
- Inherits:
-
Searchlight::Search
- Object
- Searchlight::Search
- Decidim::Initiatives::InitiativeSearch
- Includes:
- CurrentLocale
- Defined in:
- app/services/decidim/initiatives/initiative_search.rb
Overview
Service that encapsulates all logic related to filtering initiatives.
Instance Method Summary collapse
- #base_query ⇒ Object
-
#initialize(options = {}) ⇒ InitiativeSearch
constructor
Public: Initializes the service.
- #search_area_id ⇒ Object
- #search_author ⇒ Object
- #search_scope_id ⇒ Object
-
#search_search_text ⇒ Object
Handle the search_text filter.
-
#search_state ⇒ Object
Handle the state filter.
- #search_type_id ⇒ Object
Methods included from CurrentLocale
Constructor Details
#initialize(options = {}) ⇒ InitiativeSearch
Public: Initializes the service. page - The page number to paginate the results. per_page - The number of proposals to return per page.
12 13 14 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 12 def initialize( = {}) super() end |
Instance Method Details
#base_query ⇒ Object
16 17 18 19 20 21 22 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 16 def base_query Decidim::Initiative .includes(scoped_type: [:scope]) .joins("JOIN decidim_users ON decidim_users.id = decidim_initiatives.decidim_author_id") .where(organization: [:organization]) .published end |
#search_area_id ⇒ Object
91 92 93 94 95 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 91 def search_area_id return query if area_ids.include?("all") query.where(decidim_area_id: area_ids) end |
#search_author ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 65 def if == "myself" && [:current_user] = Decidim::InitiativesCommitteeMember.where( decidim_users_id: [:current_user].id ).pluck(:decidim_initiatives_id) query.where(decidim_author_id: [:current_user].id, decidim_author_type: Decidim::UserBaseEntity.name) .or(query.where(id: )) .unscope(where: :published_at) else query end end |
#search_scope_id ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 79 def search_scope_id return query if scope_ids.include?("all") clean_scope_ids = scope_ids conditions = [] conditions << "decidim_initiatives_type_scopes.decidim_scopes_id IS NULL" if clean_scope_ids.delete("global") conditions.concat(["? = ANY(decidim_scopes.part_of)"] * clean_scope_ids.count) if clean_scope_ids.any? query.joins(:scoped_type).references(:decidim_scopes).where(conditions.join(" OR "), *clean_scope_ids.map(&:to_i)) end |
#search_search_text ⇒ Object
Handle the search_text filter
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 25 def search_search_text query .where(Arel.sql("title->>'#{current_locale}' ILIKE ?").to_s, "%#{search_text}%") .or( query.where( Arel.sql("description->>'#{current_locale}' ILIKE ?").to_s, "%#{search_text}%" ) ) .or( query.where( "cast(decidim_initiatives.id as text) ILIKE ?", "%#{search_text}%" ) ) .or( query.where( "decidim_users.name ILIKE ? OR decidim_users.nickname ILIKE ?", "%#{search_text}%", "%#{search_text}%" ) ) end |
#search_state ⇒ Object
Handle the state filter
46 47 48 49 50 51 52 53 54 55 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 46 def search_state ids = [] ids += state.member?("accepted") ? query.accepted.ids : [] ids += state.member?("rejected") ? query.rejected.ids : [] ids += state.member?("answered") ? query.answered.ids : [] ids += state.member?("open") ? query.open.ids : [] ids += state.member?("closed") ? query.closed.ids : [] query.where(id: ids) end |
#search_type_id ⇒ Object
57 58 59 60 61 62 63 |
# File 'app/services/decidim/initiatives/initiative_search.rb', line 57 def search_type_id return query if type_ids.include?("all") types = InitiativesTypeScope.where(decidim_initiatives_types_id: type_ids).pluck(:id) query.where(scoped_type: types) end |