diff options
Diffstat (limited to 'app/finders/pending_todos_finder.rb')
-rw-r--r-- | app/finders/pending_todos_finder.rb | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/app/finders/pending_todos_finder.rb b/app/finders/pending_todos_finder.rb index babff65cc37..a1a72840236 100644 --- a/app/finders/pending_todos_finder.rb +++ b/app/finders/pending_todos_finder.rb @@ -13,24 +13,36 @@ class PendingTodosFinder attr_reader :users, :params - # users - The list of users to retrieve the todos for. + # 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. - def initialize(users, params = {}) - @users = users + 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 def execute - todos = Todo.for_user(users) - todos = todos.pending + todos = Todo.pending + todos = by_users(todos) todos = by_project(todos) todos = by_target_id(todos) todos = by_target_type(todos) + todos = by_author_id(todos) todos = by_discussion(todos) todos = by_commit_id(todos) + + todos = todos.with_preloaded_user if @preload_user_association + by_action(todos) end + def by_users(todos) + return todos unless params[:users].present? + + todos.for_user(params[:users]) + end + def by_project(todos) if (id = params[:project_id]) todos.for_project(id) @@ -55,6 +67,12 @@ class PendingTodosFinder end end + def by_author_id(todos) + return todos unless params[:author_id] + + todos.for_author(params[:author_id]) + end + def by_commit_id(todos) if (id = params[:commit_id]) todos.for_commit(id) |