diff --git a/app/models/user.rb b/app/models/user.rb index 5efc52d847615744215f549c36b7c703f6116752..69369ebb49bfe30869864e8836234d805e32a0ad 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2224,21 +2224,20 @@ def closest_non_global_group_notification_setting(group) end def assigned_open_merge_requests_count(force: false, cached_only: false) - Rails.cache.fetch(['users', id, 'assigned_open_merge_requests_count'], force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD, skip_nil: true) do + Rails.cache.fetch(['users', id, 'assigned_open_merge_requests_count', user_preference.role_based?], force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD, skip_nil: true) do return if cached_only # rubocop:disable Cop/AvoidReturnFromBlocks -- return from method to prevent caching nil when only reading cache params = { state: 'opened', non_archived: true, include_assigned: true, - author_id: id, - or: { - reviewer_wildcard: 'none', - review_states: %w[reviewed requested_changes], - only_reviewer_username: 'GitLabDuo' - } + author_id: id } + unless user_preference.role_based? + params[:or] = { reviewer_wildcard: 'none', review_states: %w[reviewed requested_changes], only_reviewer_username: 'GitLabDuo' } + end + begin MergeRequestsFinder.new(self, params).execute.count # rubocop:disable Database/RescueStatementTimeout, Database/RescueQueryCanceled -- Expensive query can throw 500 error, temporary while the query gets improved @@ -2300,7 +2299,7 @@ def invalidate_issue_cache_counts end def invalidate_merge_request_cache_counts - Rails.cache.delete(['users', id, 'assigned_open_merge_requests_count']) + Rails.cache.delete(['users', id, 'assigned_open_merge_requests_count', user_preference.role_based?]) Rails.cache.delete(['users', id, 'review_requested_open_merge_requests_count']) end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 966fa51a2351e650e0f422a9329e8fcd6abb7144..9cf6b9e25383088a45f4715f70e46933e441c7d3 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -6768,7 +6768,7 @@ def add_user it 'invalidates cache for merge request counters' do cache_mock = double - expect(cache_mock).to receive(:delete).with(['users', user.id, 'assigned_open_merge_requests_count']) + expect(cache_mock).to receive(:delete).with(['users', user.id, 'assigned_open_merge_requests_count', false]) expect(cache_mock).to receive(:delete).with(['users', user.id, 'review_requested_open_merge_requests_count']) allow(Rails).to receive(:cache).and_return(cache_mock) @@ -6859,7 +6859,7 @@ def add_user let_it_be_with_refind(:archived_project) { create(:project, :public, :archived) } let(:cached_only) { false } - it 'returns number of open merge requests from non-archived projects where there are no reviewers' do + before do create(:merge_request, source_project: project, author: user, assignees: [user], reviewers: [user]) create(:merge_request, source_project: project, source_branch: 'feature_conflict', author: user, assignees: [user]) create(:merge_request, :closed, source_project: project, author: user, assignees: [user]) @@ -6870,10 +6870,22 @@ def add_user mr.merge_request_reviewers.update_all(state: :reviewed) mr2.merge_request_reviewers.update_all(state: :requested_changes) + end + it 'returns number of open merge requests from non-archived projects where there are no reviewers' do is_expected.to eq 4 end + context 'when merge_request_dashboard_list_type is role_based' do + before do + user.user_preference.update!(merge_request_dashboard_list_type: 'role_based') + end + + it 'returns number of open merge requests from non-archived projects' do + is_expected.to eq 4 + end + end + context 'when fetching only cached' do let(:cached_only) { true }