2018-12-05 23:21:45 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
# GroupProjectsFinder
|
|
|
|
#
|
|
|
|
# Used to filter Projects by set of params
|
|
|
|
#
|
|
|
|
# Arguments:
|
|
|
|
# current_user - which user use
|
|
|
|
# project_ids_relation: int[] - project ids to use
|
|
|
|
# group
|
|
|
|
# options:
|
|
|
|
# only_owned: boolean
|
|
|
|
# only_shared: boolean
|
2020-01-01 13:55:28 +05:30
|
|
|
# limit: integer
|
2017-08-17 22:00:37 +05:30
|
|
|
# params:
|
|
|
|
# sort: string
|
|
|
|
# visibility_level: int
|
|
|
|
# tags: string[]
|
|
|
|
# personal: boolean
|
|
|
|
# search: string
|
|
|
|
# non_archived: boolean
|
|
|
|
#
|
|
|
|
class GroupProjectsFinder < ProjectsFinder
|
2020-01-01 13:55:28 +05:30
|
|
|
DEFAULT_PROJECTS_LIMIT = 100
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
attr_reader :group, :options
|
|
|
|
|
|
|
|
def initialize(group:, params: {}, options: {}, current_user: nil, project_ids_relation: nil)
|
2019-12-04 20:38:33 +05:30
|
|
|
super(
|
|
|
|
params: params,
|
|
|
|
current_user: current_user,
|
|
|
|
project_ids_relation: project_ids_relation
|
|
|
|
)
|
|
|
|
@group = group
|
2016-06-02 11:05:42 +05:30
|
|
|
@options = options
|
|
|
|
end
|
|
|
|
|
2020-01-01 13:55:28 +05:30
|
|
|
def execute
|
|
|
|
collection = super
|
|
|
|
limit(collection)
|
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
private
|
|
|
|
|
2020-01-01 13:55:28 +05:30
|
|
|
def limit(collection)
|
|
|
|
limit = options[:limit]
|
|
|
|
|
|
|
|
limit.present? ? collection.with_limit(limit) : collection
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
def init_collection
|
2017-09-10 17:25:29 +05:30
|
|
|
projects = if current_user
|
|
|
|
collection_with_user
|
|
|
|
else
|
|
|
|
collection_without_user
|
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
union(projects)
|
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
def collection_with_user
|
2018-11-08 19:23:39 +05:30
|
|
|
if only_shared?
|
|
|
|
[shared_projects.public_or_visible_to_user(current_user)]
|
|
|
|
elsif only_owned?
|
|
|
|
[owned_projects.public_or_visible_to_user(current_user)]
|
2016-06-02 11:05:42 +05:30
|
|
|
else
|
2018-11-08 19:23:39 +05:30
|
|
|
[
|
|
|
|
owned_projects.public_or_visible_to_user(current_user),
|
|
|
|
shared_projects.public_or_visible_to_user(current_user)
|
|
|
|
]
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
2017-09-10 17:25:29 +05:30
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
def collection_without_user
|
|
|
|
if only_shared?
|
|
|
|
[shared_projects.public_only]
|
|
|
|
elsif only_owned?
|
|
|
|
[owned_projects.public_only]
|
|
|
|
else
|
|
|
|
[shared_projects.public_only, owned_projects.public_only]
|
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
def union(items)
|
2017-09-10 17:25:29 +05:30
|
|
|
if items.one?
|
|
|
|
items.first
|
|
|
|
else
|
|
|
|
find_union(items, Project)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def only_owned?
|
|
|
|
options.fetch(:only_owned, false)
|
|
|
|
end
|
|
|
|
|
|
|
|
def only_shared?
|
|
|
|
options.fetch(:only_shared, false)
|
|
|
|
end
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
# subgroups are supported only for owned projects not for shared
|
|
|
|
def include_subgroups?
|
|
|
|
options.fetch(:include_subgroups, false)
|
|
|
|
end
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
def owned_projects
|
2018-03-17 18:26:18 +05:30
|
|
|
if include_subgroups?
|
2019-12-04 20:38:33 +05:30
|
|
|
Project.for_group_and_its_subgroups(group)
|
2018-03-17 18:26:18 +05:30
|
|
|
else
|
|
|
|
group.projects
|
|
|
|
end
|
2017-09-10 17:25:29 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def shared_projects
|
|
|
|
group.shared_projects
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
2019-12-04 20:38:33 +05:30
|
|
|
|
|
|
|
GroupProjectsFinder.prepend_if_ee('EE::GroupProjectsFinder')
|