debian-mirror-gitlab/app/finders/todos_finder.rb

176 lines
3.1 KiB
Ruby
Raw Normal View History

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
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)
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
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-09-29 09:46:39 +05:30
unless Ability.allowed?(current_user, :read_project, @project)
2016-04-02 18:10:28 +05:30
@project = nil
end
else
@project = nil
end
@project
end
2017-09-10 17:25:29 +05:30
def project_ids(items)
ids = items.except(:order).select(:project_id)
if Gitlab::Database.mysql?
# To make UPDATE work on MySQL, wrap it in a SELECT with an alias
ids = Todo.except(:order).select('*').from("(#{ids.to_sql}) AS t")
end
ids
end
2016-04-02 18:10:28 +05:30
def type?
2017-08-17 22:00:37 +05:30
type.present? && %w(Issue MergeRequest).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-03-17 18:26:18 +05:30
items.where(project: project)
2016-09-13 17:45:13 +05:30
else
2018-03-27 19:54:05 +05:30
projects = Project.public_or_visible_to_user(current_user)
2016-04-02 18:10:28 +05:30
2018-03-17 18:26:18 +05:30
items.joins(:project).merge(projects)
end
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