Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
61ae444f2402
Commit
61ae444f
authored
Mar 02, 2018
by
Andreas Brandl
Browse files
Extract method User#authorizations_for_projects.
parent
7fb675d7d82e
Changes
4
Hide whitespace changes
Inline
Side-by-side
app/finders/snippets_finder.rb
View file @
61ae444f
...
...
@@ -72,11 +72,7 @@
# we can shortcut and just return.
return
yield
(
Project
.
all
)
if
current_user
.
full_private_access?
authorized
=
current_user
.
project_authorizations
.
select
(
1
)
.
where
(
'project_authorizations.project_id = projects.id'
)
authorized_projects
=
yield
(
Project
.
where
(
'EXISTS (?)'
,
authorized
))
authorized_projects
=
yield
(
Project
.
where
(
'EXISTS (?)'
,
current_user
.
authorizations_for_projects
))
levels
=
Gitlab
::
VisibilityLevel
.
levels_for_user
(
current_user
)
visible_projects
=
yield
(
Project
.
where
(
visibility_level:
levels
))
...
...
app/models/project.rb
View file @
61ae444f
...
...
@@ -319,14 +319,9 @@
# logged in user.
def
self
.
public_or_visible_to_user
(
user
=
nil
)
if
user
authorized
=
user
.
project_authorizations
.
select
(
1
)
.
where
(
'project_authorizations.project_id = projects.id'
)
levels
=
Gitlab
::
VisibilityLevel
.
levels_for_user
(
user
)
where
(
'EXISTS (?) OR projects.visibility_level IN (?)'
,
authorized
,
levels
)
where
(
'EXISTS (?) OR projects.visibility_level IN (?)'
,
user
.
authorizations_for_projects
,
Gitlab
::
VisibilityLevel
.
levels_for_user
(
user
))
else
public_to_user
end
...
...
@@ -347,10 +342,7 @@
elsif
user
column
=
ProjectFeature
.
quoted_access_level_column
(
feature
)
authorized
=
user
.
project_authorizations
.
select
(
1
)
.
where
(
'project_authorizations.project_id = projects.id'
)
with_project_feature
.
where
(
"
#{
column
}
IN (?) OR (
#{
column
}
= ? AND EXISTS (?))"
,
visible
,
ProjectFeature
::
PRIVATE
,
...
...
@@ -353,8 +345,8 @@
with_project_feature
.
where
(
"
#{
column
}
IN (?) OR (
#{
column
}
= ? AND EXISTS (?))"
,
visible
,
ProjectFeature
::
PRIVATE
,
authoriz
ed
)
user
.
authoriz
ations_for_projects
)
else
with_feature_access_level
(
feature
,
visible
)
end
...
...
app/models/user.rb
View file @
61ae444f
...
...
@@ -601,6 +601,15 @@
authorized_projects
(
min_access_level
).
exists?
({
id:
project
.
id
})
end
# Typically used in conjunction with projects table to get projects
# a user has been given access to.
#
# Example use:
# `Project.where('EXISTS(?)', user.authorizations_for_projects)`
def
authorizations_for_projects
project_authorizations
.
select
(
1
).
where
(
'project_authorizations.project_id = projects.id'
)
end
# Returns the projects this user has reporter (or greater) access to, limited
# to at most the given projects.
#
...
...
spec/models/user_spec.rb
View file @
61ae444f
...
...
@@ -1635,6 +1635,32 @@
end
end
describe
'#authorizations_for_projects'
do
let!
(
:user
)
{
create
(
:user
)
}
subject
{
Project
.
where
(
"EXISTS (?)"
,
user
.
authorizations_for_projects
)
}
it
'includes projects that belong to a user, but no other projects'
do
owned
=
create
(
:project
,
:private
,
namespace:
user
.
namespace
)
member
=
create
(
:project
,
:private
).
tap
{
|
p
|
p
.
add_master
(
user
)
}
other
=
create
(
:project
)
expect
(
subject
).
to
include
(
owned
)
expect
(
subject
).
to
include
(
member
)
expect
(
subject
).
not_to
include
(
other
)
end
it
'includes projects a user has access to, but no other projects'
do
other_user
=
create
(
:user
)
accessible
=
create
(
:project
,
:private
,
namespace:
other_user
.
namespace
)
do
|
project
|
project
.
add_developer
(
user
)
end
other
=
create
(
:project
)
expect
(
subject
).
to
include
(
accessible
)
expect
(
subject
).
not_to
include
(
other
)
end
end
describe
'#authorized_projects'
,
:delete
do
context
'with a minimum access level'
do
it
'includes projects for which the user is an owner'
do
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment