v3: in access control object, avoid firing multiple permissions queries (even though they are cache hits)

This commit is contained in:
Konstantin Haase 2015-11-20 16:24:26 +01:00
parent 8f0b35a0f1
commit 4a3357a488

View File

@ -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