diff --git a/app/models/user.rb b/app/models/user.rb index fd0b002b69e0d7bc2e8bf3de2ea97ac8a3e1f207..26d0d31a1462924654de7c32593e96f6202b93b9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -611,7 +611,7 @@ def blocked? user.class.temporary_ignore_cross_database_tables( %w[projects], url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/424278' ) do - user.starred_projects.update_counters(star_count: -1) + user.starred_projects.where('star_count > 0').update_counters(star_count: -1) end end end diff --git a/app/models/users_star_project.rb b/app/models/users_star_project.rb index c8bc5e0dcfd01a5d8c463868e25a4fb685ae74b7..e67d2cdc0ce180e10b42dacd0d5d98b7ba1557af 100644 --- a/app/models/users_star_project.rb +++ b/app/models/users_star_project.rb @@ -47,6 +47,9 @@ def increment_project_star_count end def decrement_project_star_count - Project.update_counters(project, star_count: -1) if user.active? + return unless user.active? + return unless project.star_count > 0 + + Project.update_counters(project, star_count: -1) end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index bcefd752b518b81f4edaf9d124283284b7ae5e5e..e15af81ff908a0237fc9564ca18cc068cf06349d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -3073,6 +3073,14 @@ it 'decrements star count of project' do expect { user.block }.to change { project.reload.star_count }.by(-1) end + + context 'when star count of project is 0' do + it 'does not decrement star count of project' do + project.update!(star_count: 0) + + expect { user.block }.not_to change { project.reload.star_count } + end + end end context 'when activating a user' do diff --git a/spec/models/users_star_project_spec.rb b/spec/models/users_star_project_spec.rb index 60ec108f77d9621d56d989719834524ecc8da35d..b84ed8af6b0d7d0f8067ca334dbd22036b333904 100644 --- a/spec/models/users_star_project_spec.rb +++ b/spec/models/users_star_project_spec.rb @@ -73,6 +73,14 @@ it 'decrements star count of project' do expect { users_star_project.destroy! }.to change { project2.reload.star_count }.by(-1) end + + context 'when star count of project is 0' do + it 'does not decrement star count of project' do + project2.reload.update!(star_count: 0) + + expect { users_star_project.destroy! }.not_to change { project2.reload.star_count } + end + end end context 'if user is not active' do