diff options
author | Mike Greiling <mike@pixelcog.com> | 2017-12-07 12:11:41 +0300 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2017-12-07 12:11:41 +0300 |
commit | 2c569be63b3275c311606e4afcfb8311e810401f (patch) | |
tree | cbad93902334c10575d3e6ad1cd1f8903fa8c6f4 /app/models/concerns/bulk_member_access_load.rb | |
parent | 61bd5b2cdb19e78e5f3f5688dc6fc2668e8a5608 (diff) |
Resolve "Display member role per project"
Diffstat (limited to 'app/models/concerns/bulk_member_access_load.rb')
-rw-r--r-- | app/models/concerns/bulk_member_access_load.rb | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/app/models/concerns/bulk_member_access_load.rb b/app/models/concerns/bulk_member_access_load.rb new file mode 100644 index 00000000000..984c4f53bf7 --- /dev/null +++ b/app/models/concerns/bulk_member_access_load.rb @@ -0,0 +1,46 @@ +# Returns and caches in thread max member access for a resource +# +module BulkMemberAccessLoad + extend ActiveSupport::Concern + + included do + # Determine the maximum access level for a group of resources in bulk. + # + # Returns a Hash mapping resource ID -> maximum access level. + def max_member_access_for_resource_ids(resource_klass, resource_ids, memoization_index = self.id, &block) + raise 'Block is mandatory' unless block_given? + + resource_ids = resource_ids.uniq + key = max_member_access_for_resource_key(resource_klass, memoization_index) + access = {} + + if RequestStore.active? + RequestStore.store[key] ||= {} + access = RequestStore.store[key] + end + + # Look up only the IDs we need + resource_ids = resource_ids - access.keys + + return access if resource_ids.empty? + + resource_access = yield(resource_ids) + + access.merge!(resource_access) + + missing_resource_ids = resource_ids - resource_access.keys + + missing_resource_ids.each do |resource_id| + access[resource_id] = Gitlab::Access::NO_ACCESS + end + + access + end + + private + + def max_member_access_for_resource_key(klass, memoization_index) + "max_member_access_for_#{klass.name.underscore.pluralize}:#{memoization_index}" + end + end +end |