Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 16:16:36 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 16:16:36 +0300
commit311b0269b4eb9839fa63f80c8d7a58f32b8138a0 (patch)
tree07e7870bca8aed6d61fdcc810731c50d2c40af47 /app/models/preloaders/user_max_access_level_in_groups_preloader.rb
parent27909cef6c4170ed9205afa7426b8d3de47cbb0c (diff)
Add latest changes from gitlab-org/gitlab@14-5-stable-eev14.5.0-rc42
Diffstat (limited to 'app/models/preloaders/user_max_access_level_in_groups_preloader.rb')
-rw-r--r--app/models/preloaders/user_max_access_level_in_groups_preloader.rb29
1 files changed, 27 insertions, 2 deletions
diff --git a/app/models/preloaders/user_max_access_level_in_groups_preloader.rb b/app/models/preloaders/user_max_access_level_in_groups_preloader.rb
index 14f1d271572..bdd76d39ec1 100644
--- a/app/models/preloaders/user_max_access_level_in_groups_preloader.rb
+++ b/app/models/preloaders/user_max_access_level_in_groups_preloader.rb
@@ -3,7 +3,6 @@
module Preloaders
# This class preloads the max access level (role) for the user within the given groups and
# stores the values in requests store.
- # Will only be able to preload max access level for groups where the user is a direct member
class UserMaxAccessLevelInGroupsPreloader
include BulkMemberAccessLoad
@@ -13,8 +12,17 @@ module Preloaders
end
def execute
+ if ::Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ preload_with_traversal_ids
+ else
+ preload_direct_memberships
+ end
+ end
+
+ private
+
+ def preload_direct_memberships
group_memberships = GroupMember.active_without_invites_and_requests
- .non_minimal_access
.where(user: @user, source_id: @groups)
.group(:source_id)
.maximum(:access_level)
@@ -23,5 +31,22 @@ module Preloaders
merge_value_to_request_store(User, @user.id, group_id, max_access_level)
end
end
+
+ def preload_with_traversal_ids
+ max_access_levels = GroupMember.active_without_invites_and_requests
+ .where(user: @user)
+ .joins("INNER JOIN (#{traversal_join_sql}) as hierarchy ON members.source_id = hierarchy.traversal_id")
+ .group('hierarchy.id')
+ .maximum(:access_level)
+
+ @groups.each do |group|
+ max_access_level = max_access_levels[group.id] || Gitlab::Access::NO_ACCESS
+ merge_value_to_request_store(User, @user.id, group.id, max_access_level)
+ end
+ end
+
+ def traversal_join_sql
+ Namespace.select('id, unnest(traversal_ids) as traversal_id').where(id: @groups.map(&:id)).to_sql
+ end
end
end