Class: PendingTodosFinder
- Inherits:
-
Object
- Object
- PendingTodosFinder
- Defined in:
- app/finders/pending_todos_finder.rb
Overview
Finder for retrieving the pending todos of a user, optionally filtered using various fields.
While this finder is a bit more verbose compared to use
where(params.slice(...)), it allows us to decouple the input parameters from
the actual column names. For example, if we ever decide to use separate
columns for target types (e.g. issue_id, merge_request_id, etc), we no
longer need to change everything that uses this finder. Instead, we just
change the various by_* methods in this finder, without having to touch
everything that uses it.
Instance Attribute Summary collapse
-
#params ⇒ Object
readonly
Returns the value of attribute params.
-
#users ⇒ Object
readonly
Returns the value of attribute users.
Instance Method Summary collapse
- #by_action(todos) ⇒ Object
- #by_author_id(todos) ⇒ Object
- #by_commit_id(todos) ⇒ Object
- #by_discussion(todos) ⇒ Object
- #by_project(todos) ⇒ Object
- #by_target_id(todos) ⇒ Object
- #by_target_type(todos) ⇒ Object
- #by_users(todos) ⇒ Object
- #execute ⇒ Object
-
#initialize(params = {}) ⇒ PendingTodosFinder
constructor
users - The list of users to retrieve the todos for.
Constructor Details
#initialize(params = {}) ⇒ PendingTodosFinder
users - The list of users to retrieve the todos for. If nil is passed, it won't filter todos based on users params - A Hash containing columns and values to use for filtering todos.
18 19 20 21 22 23 |
# File 'app/finders/pending_todos_finder.rb', line 18 def initialize(params = {}) @params = params # To prevent N+1 queries when fetching the users of the PendingTodos. @preload_user_association = params.fetch(:preload_user_association, false) end |
Instance Attribute Details
#params ⇒ Object (readonly)
Returns the value of attribute params.
14 15 16 |
# File 'app/finders/pending_todos_finder.rb', line 14 def params @params end |
#users ⇒ Object (readonly)
Returns the value of attribute users.
14 15 16 |
# File 'app/finders/pending_todos_finder.rb', line 14 def users @users end |
Instance Method Details
#by_action(todos) ⇒ Object
92 93 94 95 96 |
# File 'app/finders/pending_todos_finder.rb', line 92 def by_action(todos) return todos if params[:action].blank? todos.for_action(params[:action]) end |
#by_author_id(todos) ⇒ Object
70 71 72 73 74 |
# File 'app/finders/pending_todos_finder.rb', line 70 def (todos) return todos unless params[:author_id] todos.(params[:author_id]) end |
#by_commit_id(todos) ⇒ Object
76 77 78 79 80 81 82 |
# File 'app/finders/pending_todos_finder.rb', line 76 def by_commit_id(todos) if (id = params[:commit_id]) todos.for_commit(id) else todos end end |
#by_discussion(todos) ⇒ Object
84 85 86 87 88 89 90 |
# File 'app/finders/pending_todos_finder.rb', line 84 def by_discussion(todos) if (discussion = params[:discussion]) todos.for_note(discussion.notes) else todos end end |
#by_project(todos) ⇒ Object
46 47 48 49 50 51 52 |
# File 'app/finders/pending_todos_finder.rb', line 46 def by_project(todos) if (id = params[:project_id]) todos.for_project(id) else todos end end |
#by_target_id(todos) ⇒ Object
54 55 56 57 58 59 60 |
# File 'app/finders/pending_todos_finder.rb', line 54 def by_target_id(todos) if (id = params[:target_id]) todos.for_target(id) else todos end end |
#by_target_type(todos) ⇒ Object
62 63 64 65 66 67 68 |
# File 'app/finders/pending_todos_finder.rb', line 62 def by_target_type(todos) if (type = params[:target_type]) todos.for_type(type) else todos end end |
#by_users(todos) ⇒ Object
40 41 42 43 44 |
# File 'app/finders/pending_todos_finder.rb', line 40 def by_users(todos) return todos unless params[:users].present? todos.for_user(params[:users]) end |
#execute ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'app/finders/pending_todos_finder.rb', line 25 def execute todos = Todo.pending_without_hidden todos = by_users(todos) todos = by_project(todos) todos = by_target_id(todos) todos = by_target_type(todos) todos = (todos) todos = by_discussion(todos) todos = by_commit_id(todos) todos = todos.with_preloaded_user if @preload_user_association by_action(todos) end |