2014-09-02 12:28:27 +00:00
|
|
|
# IssuableFinder
|
2014-01-15 14:16:23 +00:00
|
|
|
#
|
|
|
|
# Used to filter Issues and MergeRequests collections by set of params
|
|
|
|
#
|
|
|
|
# Arguments:
|
|
|
|
# klass - actual class like Issue or MergeRequest
|
|
|
|
# current_user - which user use
|
|
|
|
# params:
|
|
|
|
# scope: 'created-by-me' or 'assigned-to-me' or 'all'
|
|
|
|
# state: 'open' or 'closed' or 'all'
|
|
|
|
# group_id: integer
|
|
|
|
# project_id: integer
|
2015-06-28 20:12:32 +00:00
|
|
|
# milestone_title: string
|
2014-01-15 14:16:23 +00:00
|
|
|
# assignee_id: integer
|
|
|
|
# search: string
|
|
|
|
# label_name: string
|
|
|
|
# sort: string
|
|
|
|
#
|
2014-09-02 12:28:27 +00:00
|
|
|
require_relative 'projects_finder'
|
|
|
|
|
|
|
|
class IssuableFinder
|
2015-03-27 07:27:51 +00:00
|
|
|
NONE = '0'
|
2015-03-27 01:56:42 +00:00
|
|
|
|
2014-02-25 17:15:08 +00:00
|
|
|
attr_accessor :current_user, :params
|
2014-01-15 14:16:23 +00:00
|
|
|
|
2015-05-25 11:36:28 +00:00
|
|
|
def initialize(current_user, params)
|
2014-01-15 14:16:23 +00:00
|
|
|
@current_user = current_user
|
|
|
|
@params = params
|
2015-05-25 11:36:28 +00:00
|
|
|
end
|
2014-01-15 14:16:23 +00:00
|
|
|
|
2015-05-25 11:36:28 +00:00
|
|
|
def execute
|
2014-02-03 15:02:44 +00:00
|
|
|
items = init_collection
|
|
|
|
items = by_scope(items)
|
2014-01-15 14:16:23 +00:00
|
|
|
items = by_state(items)
|
|
|
|
items = by_group(items)
|
2014-02-03 16:56:31 +00:00
|
|
|
items = by_project(items)
|
2014-01-15 14:16:23 +00:00
|
|
|
items = by_search(items)
|
|
|
|
items = by_milestone(items)
|
|
|
|
items = by_assignee(items)
|
2014-12-05 15:13:07 +00:00
|
|
|
items = by_author(items)
|
2014-01-15 14:16:23 +00:00
|
|
|
items = by_label(items)
|
2015-10-03 05:56:37 +00:00
|
|
|
sort(items)
|
2014-01-15 14:16:23 +00:00
|
|
|
end
|
|
|
|
|
2015-05-25 11:36:28 +00:00
|
|
|
def group
|
|
|
|
return @group if defined?(@group)
|
|
|
|
|
2015-06-18 17:15:17 +00:00
|
|
|
@group =
|
2015-05-25 11:36:28 +00:00
|
|
|
if params[:group_id].present?
|
|
|
|
Group.find(params[:group_id])
|
2015-06-18 17:15:17 +00:00
|
|
|
else
|
2015-05-25 11:36:28 +00:00
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-10-14 10:23:49 +00:00
|
|
|
def project?
|
|
|
|
params[:project_id].present?
|
|
|
|
end
|
|
|
|
|
2015-05-25 11:36:28 +00:00
|
|
|
def project
|
|
|
|
return @project if defined?(@project)
|
|
|
|
|
2015-10-14 10:23:49 +00:00
|
|
|
if project?
|
|
|
|
@project = Project.find(params[:project_id])
|
|
|
|
|
|
|
|
unless Ability.abilities.allowed?(current_user, :read_project, @project)
|
|
|
|
@project = nil
|
|
|
|
end
|
|
|
|
else
|
|
|
|
@project = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
@project
|
|
|
|
end
|
|
|
|
|
|
|
|
def projects
|
|
|
|
return if project?
|
|
|
|
|
|
|
|
return @projects if defined?(@projects)
|
|
|
|
|
|
|
|
if current_user && params[:authorized_only].presence && !current_user_related?
|
|
|
|
current_user.authorized_projects
|
|
|
|
else
|
|
|
|
ProjectsFinder.new.execute(current_user)
|
|
|
|
end
|
2015-05-25 11:36:28 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def search
|
|
|
|
params[:search].presence
|
|
|
|
end
|
|
|
|
|
|
|
|
def milestones?
|
|
|
|
params[:milestone_title].present?
|
|
|
|
end
|
|
|
|
|
2015-10-06 16:57:13 +00:00
|
|
|
def no_milestones?
|
|
|
|
milestones? && params[:milestone_title] == Milestone::None.title
|
|
|
|
end
|
|
|
|
|
2015-05-25 11:36:28 +00:00
|
|
|
def milestones
|
|
|
|
return @milestones if defined?(@milestones)
|
|
|
|
|
|
|
|
@milestones =
|
2015-10-06 16:57:13 +00:00
|
|
|
if milestones?
|
2015-10-14 10:20:48 +00:00
|
|
|
scope =
|
|
|
|
if project
|
|
|
|
project.milestones
|
2015-10-14 10:23:49 +00:00
|
|
|
elsif projects
|
|
|
|
Milestone.where(project_id: projects)
|
2015-10-14 10:20:48 +00:00
|
|
|
else
|
2015-10-14 10:23:49 +00:00
|
|
|
Milestone.none
|
2015-10-14 10:20:48 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
scope.where(title: params[:milestone_title])
|
2015-05-25 11:36:28 +00:00
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def assignee?
|
|
|
|
params[:assignee_id].present?
|
|
|
|
end
|
|
|
|
|
|
|
|
def assignee
|
|
|
|
return @assignee if defined?(@assignee)
|
|
|
|
|
2015-06-18 17:15:17 +00:00
|
|
|
@assignee =
|
2015-05-25 11:36:28 +00:00
|
|
|
if assignee? && params[:assignee_id] != NONE
|
|
|
|
User.find(params[:assignee_id])
|
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def author?
|
|
|
|
params[:author_id].present?
|
|
|
|
end
|
|
|
|
|
|
|
|
def author
|
|
|
|
return @author if defined?(@author)
|
|
|
|
|
2015-06-18 17:15:17 +00:00
|
|
|
@author =
|
2015-05-25 11:36:28 +00:00
|
|
|
if author? && params[:author_id] != NONE
|
|
|
|
User.find(params[:author_id])
|
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-01-15 14:16:23 +00:00
|
|
|
private
|
|
|
|
|
2014-02-03 15:02:44 +00:00
|
|
|
def init_collection
|
2015-10-14 10:23:49 +00:00
|
|
|
klass.all
|
2014-02-03 15:02:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def by_scope(items)
|
2014-01-15 14:16:23 +00:00
|
|
|
case params[:scope]
|
|
|
|
when 'created-by-me', 'authored' then
|
2014-02-10 13:04:52 +00:00
|
|
|
items.where(author_id: current_user.id)
|
2014-01-15 14:16:23 +00:00
|
|
|
when 'all' then
|
2014-02-10 13:04:52 +00:00
|
|
|
items
|
2014-01-15 14:16:23 +00:00
|
|
|
when 'assigned-to-me' then
|
2014-02-10 13:04:52 +00:00
|
|
|
items.where(assignee_id: current_user.id)
|
2014-01-15 14:16:23 +00:00
|
|
|
else
|
|
|
|
raise 'You must specify default scope'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_state(items)
|
|
|
|
case params[:state]
|
|
|
|
when 'closed'
|
|
|
|
items.closed
|
2015-05-25 15:01:27 +00:00
|
|
|
when 'merged'
|
|
|
|
items.respond_to?(:merged) ? items.merged : items.closed
|
2014-01-15 14:16:23 +00:00
|
|
|
when 'all'
|
|
|
|
items
|
|
|
|
when 'opened'
|
|
|
|
items.opened
|
|
|
|
else
|
|
|
|
raise 'You must specify default state'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_group(items)
|
2015-05-25 11:36:28 +00:00
|
|
|
items = items.of_group(group) if group
|
2014-01-15 14:16:23 +00:00
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_project(items)
|
2015-10-14 10:23:49 +00:00
|
|
|
items =
|
|
|
|
if project
|
|
|
|
items.of_projects(project)
|
|
|
|
elsif projects
|
|
|
|
items.of_projects(projects).references(:project)
|
|
|
|
else
|
|
|
|
items.none
|
|
|
|
end
|
2014-01-15 14:16:23 +00:00
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_search(items)
|
2015-05-25 11:36:28 +00:00
|
|
|
items = items.search(search) if search
|
2014-01-15 14:16:23 +00:00
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def sort(items)
|
|
|
|
items.sort(params[:sort])
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_milestone(items)
|
2015-05-25 11:36:28 +00:00
|
|
|
if milestones?
|
2015-10-06 16:57:13 +00:00
|
|
|
if no_milestones?
|
|
|
|
items = items.where(milestone_id: [-1, nil])
|
|
|
|
else
|
|
|
|
items = items.where(milestone_id: milestones.try(:pluck, :id))
|
|
|
|
end
|
2014-01-15 14:16:23 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
|
|
|
def by_assignee(items)
|
2015-05-25 11:36:28 +00:00
|
|
|
if assignee?
|
|
|
|
items = items.where(assignee_id: assignee.try(:id))
|
2014-01-15 14:16:23 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
2014-12-05 15:13:07 +00:00
|
|
|
def by_author(items)
|
2015-05-25 11:36:28 +00:00
|
|
|
if author?
|
|
|
|
items = items.where(author_id: author.try(:id))
|
2014-12-05 15:13:07 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
|
|
|
|
2014-01-15 14:16:23 +00:00
|
|
|
def by_label(items)
|
|
|
|
if params[:label_name].present?
|
2015-10-06 16:57:13 +00:00
|
|
|
if params[:label_name] == Label::None.title
|
2015-10-14 10:23:49 +00:00
|
|
|
items = items.
|
|
|
|
joins("LEFT OUTER JOIN label_links ON label_links.target_type = '#{klass.name}' AND label_links.target_id = #{klass.table_name}.id").
|
|
|
|
where(label_links: { id: nil })
|
2015-10-06 16:57:13 +00:00
|
|
|
else
|
|
|
|
label_names = params[:label_name].split(",")
|
|
|
|
|
2015-10-14 10:23:49 +00:00
|
|
|
items = items.joins(:labels).where(labels: { title: label_names })
|
2014-07-30 10:26:23 +00:00
|
|
|
|
2015-10-14 10:23:49 +00:00
|
|
|
if project
|
|
|
|
items = items.where('labels.project_id = :id', id: project.id)
|
|
|
|
end
|
2015-10-06 16:57:13 +00:00
|
|
|
end
|
2014-01-15 14:16:23 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
items
|
|
|
|
end
|
2014-01-31 16:06:13 +00:00
|
|
|
|
2014-10-27 09:02:20 +00:00
|
|
|
def current_user_related?
|
|
|
|
params[:scope] == 'created-by-me' || params[:scope] == 'authored' || params[:scope] == 'assigned-to-me'
|
|
|
|
end
|
2014-01-15 14:16:23 +00:00
|
|
|
end
|