Merge branch '26126-cache-even-when-no-projects' into 'master'

Cache project authorizations even when user has access to zero projects

Closes #26126

See merge request !8327
This commit is contained in:
Yorick Peterse 2016-12-28 14:55:44 +00:00
commit 0d93016152
3 changed files with 36 additions and 7 deletions

View file

@ -74,7 +74,7 @@ module Users
# remove - The IDs of the authorization rows to remove. # remove - The IDs of the authorization rows to remove.
# add - Rows to insert in the form `[user id, project id, access level]` # add - Rows to insert in the form `[user id, project id, access level]`
def update_authorizations(remove = [], add = []) def update_authorizations(remove = [], add = [])
return if remove.empty? && add.empty? return if remove.empty? && add.empty? && user.authorized_projects_populated
User.transaction do User.transaction do
user.remove_project_authorizations(remove) unless remove.empty? user.remove_project_authorizations(remove) unless remove.empty?

View file

@ -0,0 +1,4 @@
---
title: Cache project authorizations even when user has access to zero projects
merge_request: 8327
author:

View file

@ -54,13 +54,38 @@ describe Users::RefreshAuthorizedProjectsService do
end end
describe '#update_authorizations' do describe '#update_authorizations' do
it 'does nothing when there are no rows to add and remove' do context 'when there are no rows to add and remove' do
it 'does not change authorizations' do
expect(user).not_to receive(:remove_project_authorizations) expect(user).not_to receive(:remove_project_authorizations)
expect(ProjectAuthorization).not_to receive(:insert_authorizations) expect(ProjectAuthorization).not_to receive(:insert_authorizations)
service.update_authorizations([], [])
end
context 'when the authorized projects column is not set' do
before do
user.update!(authorized_projects_populated: nil)
end
it 'populates the authorized projects column' do
service.update_authorizations([], [])
expect(user.authorized_projects_populated).to eq true
end
end
context 'when the authorized projects column is set' do
before do
user.update!(authorized_projects_populated: true)
end
it 'does nothing' do
expect(user).not_to receive(:set_authorized_projects_column) expect(user).not_to receive(:set_authorized_projects_column)
service.update_authorizations([], []) service.update_authorizations([], [])
end end
end
end
it 'removes authorizations that should be removed' do it 'removes authorizations that should be removed' do
authorization = create_authorization(project, user) authorization = create_authorization(project, user)
@ -84,7 +109,7 @@ describe Users::RefreshAuthorizedProjectsService do
it 'populates the authorized projects column' do it 'populates the authorized projects column' do
# make sure we start with a nil value no matter what the default in the # make sure we start with a nil value no matter what the default in the
# factory may be. # factory may be.
user.update(authorized_projects_populated: nil) user.update!(authorized_projects_populated: nil)
service.update_authorizations([], [[user.id, project.id, Gitlab::Access::MASTER]]) service.update_authorizations([], [[user.id, project.id, Gitlab::Access::MASTER]])