Refactor UsersController to not kill the database
Previously this controller would in multiple places load tons (read: around 65000) project and/or group IDs into memory. These changes in combination with the previous commits significantly cut down loading times of user profile pages and the Atom feeds of users.
This commit is contained in:
parent
e116a356b8
commit
fbdf376749
2 changed files with 29 additions and 23 deletions
|
@ -3,14 +3,11 @@ class UsersController < ApplicationController
|
|||
before_action :set_user
|
||||
|
||||
def show
|
||||
@contributed_projects = contributed_projects.joined(@user).
|
||||
reject(&:forked?)
|
||||
@contributed_projects = contributed_projects.joined(@user).reject(&:forked?)
|
||||
|
||||
@projects = @user.personal_projects.
|
||||
where(id: authorized_projects_ids).includes(:namespace)
|
||||
@projects = PersonalProjectsFinder.new(@user).execute(current_user)
|
||||
|
||||
# Collect only groups common for both users
|
||||
@groups = @user.groups & GroupsFinder.new.execute(current_user)
|
||||
@groups = JoinedGroupsFinder.new(@user).execute(current_user)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
|
@ -53,16 +50,8 @@ class UsersController < ApplicationController
|
|||
@user = User.find_by_username!(params[:username])
|
||||
end
|
||||
|
||||
def authorized_projects_ids
|
||||
# Projects user can view
|
||||
@authorized_projects_ids ||=
|
||||
ProjectsFinder.new.execute(current_user).pluck(:id)
|
||||
end
|
||||
|
||||
def contributed_projects
|
||||
@contributed_projects = Project.
|
||||
where(id: authorized_projects_ids & @user.contributed_projects_ids).
|
||||
includes(:namespace)
|
||||
ContributedProjectsFinder.new(@user).execute(current_user)
|
||||
end
|
||||
|
||||
def contributions_calendar
|
||||
|
@ -73,9 +62,13 @@ class UsersController < ApplicationController
|
|||
def load_events
|
||||
# Get user activity feed for projects common for both users
|
||||
@events = @user.recent_events.
|
||||
where(project_id: authorized_projects_ids).
|
||||
with_associations
|
||||
merge(projects_for_current_user).
|
||||
references(:project).
|
||||
with_associations.
|
||||
limit_recent(20, params[:offset])
|
||||
end
|
||||
|
||||
@events = @events.limit(20).offset(params[:offset] || 0)
|
||||
def projects_for_current_user
|
||||
ProjectsFinder.new.execute(current_user)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -16,13 +16,26 @@ describe UsersController do
|
|||
context 'with rendered views' do
|
||||
render_views
|
||||
|
||||
it 'renders the show template' do
|
||||
sign_in(user)
|
||||
describe 'when logged in' do
|
||||
before do
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
get :show, username: user.username
|
||||
it 'renders the show template' do
|
||||
get :show, username: user.username
|
||||
|
||||
expect(response).to be_success
|
||||
expect(response).to render_template('show')
|
||||
expect(response).to be_success
|
||||
expect(response).to render_template('show')
|
||||
end
|
||||
end
|
||||
|
||||
describe 'when logged out' do
|
||||
it 'renders the show template' do
|
||||
get :show, username: user.username
|
||||
|
||||
expect(response).to be_success
|
||||
expect(response).to render_template('show')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue