Memoize the maximum access level for the author of notes
In #19273, we saw that retrieving ProjectTeam#human_max_access for each note takes the bulk of the time when rendering certain issues or merge requests. We observe that most of the comments in an issue are typically done by the same users. This MR memoizes the max access level by user ID.
This commit is contained in:
parent
a4b1fe4de9
commit
8c29b0b065
3 changed files with 41 additions and 1 deletions
|
@ -69,4 +69,12 @@ module NotesHelper
|
|||
button_tag 'Reply...', class: 'btn btn-text-field js-discussion-reply-button',
|
||||
data: data, title: 'Add a reply'
|
||||
end
|
||||
|
||||
def note_max_access_for_user(note)
|
||||
user_id = note.author.id
|
||||
project = note.project
|
||||
@max_access_by_user_id ||= Hash.new { |hash, key| hash[key] = project.team.human_max_access(key) }
|
||||
|
||||
@max_access_by_user_id[user_id]
|
||||
end
|
||||
end
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
%a{ href: "##{dom_id(note)}" }
|
||||
= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago')
|
||||
.note-actions
|
||||
- access = note.project.team.human_max_access(note.author.id)
|
||||
- access = note_max_access_for_user(note)
|
||||
- if access and not note.system
|
||||
%span.note-role.hidden-xs= access
|
||||
- if current_user and not note.system
|
||||
|
|
32
spec/helpers/notes_helper_spec.rb
Normal file
32
spec/helpers/notes_helper_spec.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
require "spec_helper"
|
||||
|
||||
describe NotesHelper do
|
||||
describe "#notes_max_access_for_users" do
|
||||
let(:owner) { create(:owner) }
|
||||
let(:group) { create(:group) }
|
||||
let(:project) { create(:empty_project, namespace: group) }
|
||||
let(:master) { create(:user) }
|
||||
let(:reporter) { create(:user) }
|
||||
let(:guest) { create(:user) }
|
||||
|
||||
let(:owner_note) { create(:note, author: owner, project: project) }
|
||||
let(:master_note) { create(:note, author: master, project: project) }
|
||||
let(:reporter_note) { create(:note, author: reporter, project: project) }
|
||||
let!(:notes) { [owner_note, master_note, reporter_note] }
|
||||
|
||||
before do
|
||||
group.add_owner(owner)
|
||||
project.team << [master, :master]
|
||||
project.team << [reporter, :reporter]
|
||||
project.team << [guest, :guest]
|
||||
end
|
||||
|
||||
it 'return human access levels' do
|
||||
expect(helper.note_max_access_for_user(owner_note)).to eq('Owner')
|
||||
expect(helper.note_max_access_for_user(master_note)).to eq('Master')
|
||||
expect(helper.note_max_access_for_user(reporter_note)).to eq('Reporter')
|
||||
# Call it again to ensure value is cached
|
||||
expect(helper.note_max_access_for_user(owner_note)).to eq('Owner')
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue