From c6af1ee9b3aab70edd2da95393b5113faefce45b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 12 Sep 2025 11:41:39 +0100 Subject: [PATCH] Fix merge request count for role based rendering Fixes the count for merge requests in the nav bar when the user has the merge request dashboard to render as role based. --- app/models/user.rb | 15 +++++++-------- spec/models/user_spec.rb | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 5efc52d8476157..69369ebb49bfe3 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 966fa51a2351e6..9cf6b9e2538308 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 } -- GitLab