From 4a3357a4888b424a1074d2f3c10df951467e185a Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Fri, 20 Nov 2015 16:24:26 +0100 Subject: [PATCH] v3: in access control object, avoid firing multiple permissions queries (even though they are cache hits) --- lib/travis/api/v3/access_control/user.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/travis/api/v3/access_control/user.rb b/lib/travis/api/v3/access_control/user.rb index e48bb577..5b6460fe 100644 --- a/lib/travis/api/v3/access_control/user.rb +++ b/lib/travis/api/v3/access_control/user.rb @@ -8,6 +8,7 @@ module Travis::API::V3 user = Models::User.find(user.id) if user.is_a? ::User @user = user @access_permissions = user.permissions.where(user_id: user.id) + @got_request = false super() end @@ -20,6 +21,7 @@ module Travis::API::V3 end def visible_repositories(list) + load_permissions list.where('repositories.private = false OR repositories.id IN (?)'.freeze, access_permissions.map(&:repository_id)) end @@ -47,7 +49,19 @@ module Travis::API::V3 def permission?(type, id) id = id.id if id.is_a? ::Repository - access_permissions.where(type => true, :repository_id => id).any? + + load_permissions if @got_request + @got_request = true + + if access_permissions.respond_to? :where + access_permissions.where(type => true, :repository_id => id).any? + else + access_permissions.any? { |p| p[type] == true and p.repository_id == id } + end + end + + def load_permissions + @access_permissions = @access_permissions.to_a end end end