diff --git a/ee/app/models/merge_requests/approval_rule.rb b/ee/app/models/merge_requests/approval_rule.rb index 5d24cf7a9c5348b537c365266480fc216e61165f..665a114424138e7177d1fe6fe648193b8e55c0bb 100644 --- a/ee/app/models/merge_requests/approval_rule.rb +++ b/ee/app/models/merge_requests/approval_rule.rb @@ -43,6 +43,8 @@ class ApprovalRule < ApplicationRecord enum :origin, { group: 0, project: 1, merge_request: 2 }, prefix: :originates_from end + before_validation :set_sharding_key + def approvers [] end @@ -57,6 +59,16 @@ def report_type private + # Currently this is narrowly scoped to issue + # https://gitlab.com/gitlab-org/gitlab/-/issues/536752 + # for the purposes of MR level approval rules, so we early return for now. + # As we implement more layers, this needs to be updated. + def set_sharding_key + return unless originates_from_merge_request? + + self.project_id = merge_request.project_id + end + def ensure_single_sharding_key return errors.add(:base, "Must have either `group_id` or `project_id`") if no_sharding_key? diff --git a/ee/spec/models/merge_requests/approval_rule_spec.rb b/ee/spec/models/merge_requests/approval_rule_spec.rb index 5fd721d76b74c0ace33ab33f7455d09017261048..c0dbfd80649f4fa032977430c6d2c79685a80884 100644 --- a/ee/spec/models/merge_requests/approval_rule_spec.rb +++ b/ee/spec/models/merge_requests/approval_rule_spec.rb @@ -9,6 +9,43 @@ subject(:rule) { build(:merge_requests_approval_rule, attributes) } + describe 'setting sharding key' do + let_it_be(:project) { create(:project) } + let_it_be(:group) { create(:group) } + let_it_be(:merge_request) { create(:merge_request, source_project: project) } + + context 'when originating from a merge request' do + let(:approval_rule) do + build( + :merge_requests_approval_rule, + origin: :merge_request, + merge_request: merge_request + ) + end + + it 'sets project_id to merge request project id before validating' do + expect(approval_rule.project_id).to be_nil + approval_rule.save! + expect(approval_rule.project_id).not_to be_nil + expect(approval_rule.project_id).to eq(merge_request.project_id) + end + end + + context 'when not originating from a merge request' do + let(:approval_rule) do + build(:merge_requests_approval_rule, origin: :project) + end + + it 'does not automatically set any sharding key' do + # This should fail validation since we're not setting any sharding key and the implementation to handle this + # case is out of scope for + # https://gitlab.com/gitlab-org/gitlab/-/issues/536752 + # Update as we add more layers of functionality. + expect { approval_rule.save! }.to raise_error(ActiveRecord::RecordInvalid) + end + end + end + describe 'validations' do describe 'sharding key validation' do context 'with group_id' do