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

101 lines
2.2 KiB
Ruby
Raw Normal View History

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
# params:
# sort: string
# visibility_level: int
# tags: string[]
# personal: boolean
# search: string
# non_archived: boolean
#
class GroupProjectsFinder < ProjectsFinder
attr_reader :group, :options
def initialize(group:, params: {}, options: {}, current_user: nil, project_ids_relation: nil)
super(params: params, current_user: current_user, project_ids_relation: project_ids_relation)
2016-06-02 11:05:42 +05:30
@group = group
@options = options
end
private
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
2018-12-05 23:21:45 +05:30
# rubocop: disable CodeReuse/ActiveRecord
2017-09-10 17:25:29 +05:30
def owned_projects
2018-03-17 18:26:18 +05:30
if include_subgroups?
Project.where(namespace_id: group.self_and_descendants.select(:id))
else
group.projects
end
2017-09-10 17:25:29 +05:30
end
2018-12-05 23:21:45 +05:30
# rubocop: enable CodeReuse/ActiveRecord
2017-09-10 17:25:29 +05:30
def shared_projects
group.shared_projects
2017-08-17 22:00:37 +05:30
end
2016-06-02 11:05:42 +05:30
end