2016-04-02 18:10:28 +05:30
|
|
|
# TodosFinder
|
|
|
|
#
|
|
|
|
# Used to filter Todos by set of params
|
|
|
|
#
|
|
|
|
# Arguments:
|
|
|
|
# current_user - which user use
|
|
|
|
# params:
|
|
|
|
# action_id: integer
|
|
|
|
# author_id: integer
|
|
|
|
# project_id; integer
|
2016-08-24 12:49:21 +05:30
|
|
|
# state: 'pending' (default) or 'done'
|
2016-04-02 18:10:28 +05:30
|
|
|
# type: 'Issue' or 'MergeRequest'
|
|
|
|
#
|
|
|
|
|
|
|
|
class TodosFinder
|
2018-03-27 19:54:05 +05:30
|
|
|
prepend FinderWithCrossProjectAccess
|
|
|
|
include FinderMethods
|
2018-11-18 11:00:15 +05:30
|
|
|
include Gitlab::Utils::StrongMemoize
|
2018-03-27 19:54:05 +05:30
|
|
|
|
|
|
|
requires_cross_project_access unless: -> { project? }
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
NONE = '0'.freeze
|
2016-04-02 18:10:28 +05:30
|
|
|
|
|
|
|
attr_accessor :current_user, :params
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
def initialize(current_user, params = {})
|
2016-04-02 18:10:28 +05:30
|
|
|
@current_user = current_user
|
|
|
|
@params = params
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute
|
|
|
|
items = current_user.todos
|
|
|
|
items = by_action_id(items)
|
2016-08-24 12:49:21 +05:30
|
|
|
items = by_action(items)
|
2016-04-02 18:10:28 +05:30
|
|
|
items = by_author(items)
|
|
|
|
items = by_state(items)
|
|
|
|
items = by_type(items)
|
2018-11-18 11:00:15 +05:30
|
|
|
items = by_group(items)
|
2016-09-13 17:45:13 +05:30
|
|
|
# Filtering by project HAS TO be the last because we use
|
|
|
|
# the project IDs yielded by the todos query thus far
|
|
|
|
items = by_project(items)
|
2016-04-02 18:10:28 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
sort(items)
|
2016-04-02 18:10:28 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def action_id?
|
2017-09-10 17:25:29 +05:30
|
|
|
action_id.present? && Todo::ACTION_NAMES.key?(action_id.to_i)
|
2016-04-02 18:10:28 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def action_id
|
|
|
|
params[:action_id]
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
def to_action_id
|
|
|
|
Todo::ACTION_NAMES.key(action.to_sym)
|
|
|
|
end
|
|
|
|
|
|
|
|
def action?
|
|
|
|
action.present? && to_action_id
|
|
|
|
end
|
|
|
|
|
|
|
|
def action
|
|
|
|
params[:action]
|
|
|
|
end
|
|
|
|
|
2016-04-02 18:10:28 +05:30
|
|
|
def author?
|
|
|
|
params[:author_id].present?
|
|
|
|
end
|
|
|
|
|
|
|
|
def author
|
|
|
|
return @author if defined?(@author)
|
|
|
|
|
|
|
|
@author =
|
|
|
|
if author? && params[:author_id] != NONE
|
|
|
|
User.find(params[:author_id])
|
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def project?
|
|
|
|
params[:project_id].present?
|
|
|
|
end
|
|
|
|
|
2018-11-18 11:00:15 +05:30
|
|
|
def group?
|
|
|
|
params[:group_id].present?
|
|
|
|
end
|
|
|
|
|
2016-04-02 18:10:28 +05:30
|
|
|
def project
|
|
|
|
return @project if defined?(@project)
|
|
|
|
|
|
|
|
if project?
|
|
|
|
@project = Project.find(params[:project_id])
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
@project = nil if @project.pending_delete?
|
2016-04-02 18:10:28 +05:30
|
|
|
else
|
|
|
|
@project = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
@project
|
|
|
|
end
|
|
|
|
|
2018-11-18 11:00:15 +05:30
|
|
|
def group
|
|
|
|
strong_memoize(:group) do
|
|
|
|
Group.find(params[:group_id])
|
2017-09-10 17:25:29 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-02 18:10:28 +05:30
|
|
|
def type?
|
2018-11-18 11:00:15 +05:30
|
|
|
type.present? && %w(Issue MergeRequest Epic).include?(type)
|
2016-04-02 18:10:28 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def type
|
|
|
|
params[:type]
|
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
def sort(items)
|
2018-05-09 12:01:36 +05:30
|
|
|
params[:sort] ? items.sort_by_attribute(params[:sort]) : items.order_id_desc
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
def by_action(items)
|
|
|
|
if action?
|
|
|
|
items = items.where(action: to_action_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
2016-04-02 18:10:28 +05:30
|
|
|
def by_action_id(items)
|
|
|
|
if action_id?
|
|
|
|
items = items.where(action: action_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_author(items)
|
|
|
|
if author?
|
|
|
|
items = items.where(author_id: author.try(:id))
|
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_project(items)
|
|
|
|
if project?
|
2018-11-18 11:00:15 +05:30
|
|
|
items = items.where(project: project)
|
|
|
|
end
|
2016-04-02 18:10:28 +05:30
|
|
|
|
2018-11-18 11:00:15 +05:30
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_group(items)
|
|
|
|
if group?
|
|
|
|
groups = group.self_and_descendants
|
|
|
|
project_todos = items.where(project_id: Project.where(group: groups).select(:id))
|
|
|
|
group_todos = items.where(group_id: groups.select(:id))
|
|
|
|
|
|
|
|
union = Gitlab::SQL::Union.new([project_todos, group_todos])
|
|
|
|
items = Todo.from("(#{union.to_sql}) #{Todo.table_name}")
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2018-11-18 11:00:15 +05:30
|
|
|
|
|
|
|
items
|
2016-04-02 18:10:28 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def by_state(items)
|
2016-06-22 15:30:34 +05:30
|
|
|
case params[:state].to_s
|
2016-04-02 18:10:28 +05:30
|
|
|
when 'done'
|
|
|
|
items.done
|
|
|
|
else
|
|
|
|
items.pending
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_type(items)
|
|
|
|
if type?
|
|
|
|
items = items.where(target_type: type)
|
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
end
|