Skip to content

Commit 0fdce4a

Browse files
committed
Refactor some search scopes to prevent wierd behaviour and PG::Error issues
Signed-off-by: Dmitriy Zaporozhets <[email protected]>
1 parent 4ca6ebf commit 0fdce4a

10 files changed

+53
-32
lines changed

app/controllers/users_controller.rb

+13-4
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,24 @@ class UsersController < ApplicationController
44

55
def show
66
@user = User.find_by_username!(params[:username])
7-
@projects = Project.personal(@user).accessible_to(current_user)
87

98
unless current_user || @user.public_profile?
109
return authenticate_user!
1110
end
1211

13-
@groups = @user.groups.accessible_to(current_user)
14-
accessible_projects = @user.authorized_projects.accessible_to(current_user)
15-
@events = @user.recent_events.where(project_id: accessible_projects.pluck(:id)).limit(20)
12+
# Projects user can view
13+
authorized_projects_ids = ProjectsFinder.new.execute(current_user).pluck(:id)
14+
15+
@projects = @user.personal_projects.
16+
where(id: authorized_projects_ids)
17+
18+
# Collect only groups common for both users
19+
@groups = @user.groups & GroupsFinder.new.execute(current_user)
20+
21+
# Get user activity feed for projects common for both users
22+
@events = @user.recent_events.
23+
where(project_id: authorized_projects_ids).limit(20)
24+
1625
@title = @user.name
1726
end
1827

app/finders/base_finder.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def init_collection
4949
elsif current_user && params[:authorized_only].presence
5050
klass.of_projects(current_user.authorized_projects).references(:project)
5151
else
52-
klass.of_projects(Project.accessible_to(current_user)).references(:project)
52+
klass.of_projects(ProjectsFinder.new.execute(current_user)).references(:project)
5353
end
5454
end
5555

app/finders/projects_finder.rb

+32-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class ProjectsFinder
2-
def execute(current_user, options)
2+
def execute(current_user, options = {})
33
group = options[:group]
44

55
if group
@@ -56,8 +56,36 @@ def group_projects(current_user, group)
5656
end
5757
end
5858

59-
def all_projects
60-
# TODO: implement
61-
raise 'Not implemented yet'
59+
def all_projects(current_user)
60+
if current_user
61+
if current_user.authorized_projects.any?
62+
# User has access to private projects
63+
#
64+
# Return only:
65+
# public projects
66+
# internal projects
67+
# joined projects
68+
#
69+
Project.where(
70+
"projects.id IN (?) OR projects.visibility_level IN (?)",
71+
current_user.authorized_projects.pluck(:id),
72+
Project.public_and_internal_levels
73+
)
74+
else
75+
# User has no access to private projects
76+
#
77+
# Return only:
78+
# public projects
79+
# internal projects
80+
#
81+
Project.public_and_internal_only
82+
end
83+
else
84+
# Not authenticated
85+
#
86+
# Return only:
87+
# public projects
88+
Project.public_only
89+
end
6290
end
6391
end

app/helpers/search_helper.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def groups_autocomplete(term, limit = 5)
8181

8282
# Autocomplete results for the current user's projects
8383
def projects_autocomplete(term, limit = 5)
84-
Project.accessible_to(current_user).search_by_title(term).non_archived.limit(limit).map do |p|
84+
ProjectsFinder.new.execute(current_user).search_by_title(term).non_archived.limit(limit).map do |p|
8585
{
8686
label: "project: #{search_result_sanitize(p.name_with_namespace)}",
8787
url: project_path(p)

app/helpers/submodule_helper.rb

100755100644
File mode changed.

app/models/ability.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def not_auth_abilities(user, subject)
5151
nil
5252
end
5353

54-
if group && group.has_projects_accessible_to?(nil)
54+
if group && group.public_profile?
5555
[:read_group]
5656
else
5757
[]

app/models/group.rb

+4-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ class Group < Namespace
2727

2828
mount_uploader :avatar, AttachmentUploader
2929

30-
def self.accessible_to(user)
31-
accessible_ids = Project.accessible_to(user).pluck(:namespace_id)
32-
accessible_ids += user.groups.pluck(:id) if user
33-
where(id: accessible_ids)
34-
end
35-
3630
def human_name
3731
name
3832
end
@@ -77,4 +71,8 @@ def avatar_type
7771
self.errors.add :avatar, "only images allowed"
7872
end
7973
end
74+
75+
def public_profile?
76+
projects.public_only.any?
77+
end
8078
end

app/models/namespace.rb

-8
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,6 @@ def self.search query
4747
def self.global_id
4848
'GLN'
4949
end
50-
51-
def projects_accessible_to(user)
52-
projects.accessible_to(user)
53-
end
54-
55-
def has_projects_accessible_to?(user)
56-
projects_accessible_to(user).present?
57-
end
5850

5951
def to_param
6052
path

app/models/project.rb

-6
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,6 @@ def publicish(user)
164164
where(visibility_level: visibility_levels)
165165
end
166166

167-
def accessible_to(user)
168-
accessible_ids = publicish(user).pluck(:id)
169-
accessible_ids += user.authorized_projects.pluck(:id) if user
170-
where(id: accessible_ids)
171-
end
172-
173167
def with_push
174168
includes(:events).where('events.action = ?', Event::PUSHED)
175169
end

app/services/search/global_service.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def execute
1212
return result unless query.present?
1313

1414
group = Group.find_by(id: params[:group_id]) if params[:group_id].present?
15-
projects = Project.accessible_to(current_user)
15+
projects = ProjectsFinder.new.execute(current_user)
1616
projects = projects.where(namespace_id: group.id) if group
1717
project_ids = projects.pluck(:id)
1818

0 commit comments

Comments
 (0)