summaryrefslogtreecommitdiff
path: root/app/finders/group_members_finder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/finders/group_members_finder.rb')
-rw-r--r--app/finders/group_members_finder.rb33
1 files changed, 11 insertions, 22 deletions
diff --git a/app/finders/group_members_finder.rb b/app/finders/group_members_finder.rb
index 75623d33ef5..fff17098c7b 100644
--- a/app/finders/group_members_finder.rb
+++ b/app/finders/group_members_finder.rb
@@ -1,14 +1,15 @@
# frozen_string_literal: true
class GroupMembersFinder < UnionFinder
- RELATIONS = %i(direct inherited descendants).freeze
+ RELATIONS = %i(direct inherited descendants shared_from_groups).freeze
DEFAULT_RELATIONS = %i(direct inherited).freeze
INVALID_RELATION_TYPE_ERROR_MSG = "is not a valid relation type. Valid relation types are #{RELATIONS.join(', ')}."
RELATIONS_DESCRIPTIONS = {
direct: 'Members in the group itself',
inherited: "Members in the group's ancestor groups",
- descendants: "Members in the group's subgroups"
+ descendants: "Members in the group's subgroups",
+ shared_from_groups: "Invited group's members"
}.freeze
include CreatedAtFilter
@@ -28,11 +29,7 @@ class GroupMembersFinder < UnionFinder
end
def execute(include_relations: DEFAULT_RELATIONS)
- return filter_members(group_members_list) if include_relations == [:direct]
-
groups = groups_by_relations(include_relations)
- return GroupMember.none unless groups
-
members = all_group_members(groups).distinct_on_user_with_max_access_level
filter_members(members)
@@ -45,22 +42,14 @@ class GroupMembersFinder < UnionFinder
def groups_by_relations(include_relations)
check_relation_arguments!(include_relations)
- case include_relations.sort
- when [:inherited]
- group.ancestors
- when [:descendants]
- group.descendants
- when [:direct, :inherited]
- group.self_and_ancestors
- when [:descendants, :direct]
- group.self_and_descendants
- when [:descendants, :inherited]
- find_union([group.ancestors, group.descendants], Group)
- when [:descendants, :direct, :inherited]
- group.self_and_hierarchy
- else
- nil
- end
+ related_groups = []
+
+ related_groups << Group.by_id(group.id) if include_relations&.include?(:direct)
+ related_groups << group.ancestors if include_relations&.include?(:inherited)
+ related_groups << group.descendants if include_relations&.include?(:descendants)
+ related_groups << group.shared_with_groups.public_or_visible_to_user(user) if include_relations&.include?(:shared_from_groups)
+
+ find_union(related_groups, Group)
end
def filter_members(members)