Class: Decidim::Proposals::CollaborativeDraftSearch

Inherits:
ResourceSearch
  • Object
show all
Defined in:
decidim-proposals/app/services/decidim/proposals/collaborative_draft_search.rb

Overview

A service to encapsualte all the logic when searching and filtering collaborative drafts in a participatory process.

Instance Attribute Summary

Attributes inherited from ResourceSearch

#component, #organization, #user

Instance Method Summary collapse

Methods inherited from ResourceSearch

#base_query, #results, #search_category_id, #search_origin, #search_scope_id, text_search_fields

Constructor Details

#initialize(options = {}) ⇒ CollaborativeDraftSearch

Public: Initializes the service. component - A Decidim::Component to get the drafts from. page - The page number to paginate the results. per_page - The number of drafts to return per page.


14
15
16
# File 'decidim-proposals/app/services/decidim/proposals/collaborative_draft_search.rb', line 14

def initialize(options = {})
  super(CollaborativeDraft.all, options)
end

Instance Method Details

Filters drafts by the name of the classes they are linked to. By default, returns all drafts. When a `related_to` param is given, then it camelcases item to find the real class name and checks the links for the Collaborative Draft.

The `related_to` param is expected to be in this form:

"decidim/meetings/meeting"

This can be achieved by performing `klass.name.underscore`.

Returns only those drafts that are linked to the given class name.


46
47
48
49
50
51
52
53
54
55
56
# File 'decidim-proposals/app/services/decidim/proposals/collaborative_draft_search.rb', line 46

def search_related_to
  from = query
         .joins(:resource_links_from)
         .where(decidim_resource_links: { to_type: related_to.camelcase })

  to = query
       .joins(:resource_links_to)
       .where(decidim_resource_links: { from_type: related_to.camelcase })

  query.where(id: from).or(query.where(id: to))
end

#search_search_textObject

Handle the search_text filter

We can't use the search from `ResourceFilter` since these fields aren't translated.


22
23
24
25
26
# File 'decidim-proposals/app/services/decidim/proposals/collaborative_draft_search.rb', line 22

def search_search_text
  query
    .where("title::text ILIKE ?", "%#{search_text}%")
    .or(query.where("body ILIKE ?", "%#{search_text}%"))
end

#search_stateObject

Handle the state filter


29
30
31
32
33
# File 'decidim-proposals/app/services/decidim/proposals/collaborative_draft_search.rb', line 29

def search_state
  return query if state.member?("all")

  apply_scopes(%w(open withdrawn published), state)
end