From 29e2afe3ef100c5676be95fbf730fe6a97c85c49 Mon Sep 17 00:00:00 2001 From: Joe Woodward Date: Thu, 28 Nov 2024 14:51:24 +0000 Subject: [PATCH 1/2] PoC for Approval Rules Rearchitecture --- db/docs/approval_group_rules.yml | 1 + db/docs/approval_merge_request_rules.yml | 1 + db/docs/approval_project_rules.yml | 1 + .../merge_requests_approval_group_rules.yml | 11 ++ ..._requests_approval_merge_request_rules.yml | 11 ++ .../merge_requests_approval_project_rules.yml | 11 ++ db/docs/merge_requests_approval_rules.yml | 11 ++ ...55_create_merge_requests_approval_rules.rb | 23 +++ ...e_merge_requests_approval_project_rules.rb | 21 +++ ...r_merge_requests_approval_project_rules.rb | 22 +++ ...ate_merge_requests_approval_group_rules.rb | 21 +++ ...for_merge_requests_approval_group_rules.rb | 21 +++ ...e_requests_approval_merge_request_rules.rb | 26 ++++ ...e_requests_approval_merge_request_rules.rb | 21 +++ ...origin_in_merge_requests_approval_rules.rb | 12 ++ ...190516_add_references_to_approval_rules.rb | 26 ++++ ...1120607_remove_approval_rule_references.rb | 26 ++++ db/schema_migrations/20241030105355 | 1 + db/schema_migrations/20241030105509 | 1 + db/schema_migrations/20241030105510 | 1 + db/schema_migrations/20241030105539 | 1 + db/schema_migrations/20241030105540 | 1 + db/schema_migrations/20241030105638 | 1 + db/schema_migrations/20241030162939 | 1 + db/schema_migrations/20241030183831 | 1 + db/schema_migrations/20241030190516 | 1 + db/schema_migrations/20241031120607 | 1 + db/structure.sql | 142 ++++++++++++++++++ ee/app/models/ee/group.rb | 3 + ee/app/models/ee/merge_request.rb | 5 +- ee/app/models/ee/project.rb | 5 +- .../merge_requests/approval_group_rule.rb | 9 ++ .../approval_merge_request_rule.rb | 9 ++ .../merge_requests/approval_project_rule.rb | 9 ++ ee/app/models/merge_requests/approval_rule.rb | 77 ++++++++++ .../merge_requests/approval_group_rules.rb | 8 + .../approval_merge_request_rules.rb | 6 + .../merge_requests/approval_project_rules.rb | 6 + .../merge_requests/approval_rules.rb | 7 + .../approval_group_rule_spec.rb | 12 ++ .../approval_merge_request_rule_spec.rb | 12 ++ .../approval_project_rule_spec.rb | 12 ++ .../merge_requests/approval_rule_spec.rb | 16 ++ 43 files changed, 612 insertions(+), 2 deletions(-) create mode 100644 db/docs/merge_requests_approval_group_rules.yml create mode 100644 db/docs/merge_requests_approval_merge_request_rules.yml create mode 100644 db/docs/merge_requests_approval_project_rules.yml create mode 100644 db/docs/merge_requests_approval_rules.yml create mode 100644 db/migrate/20241030105355_create_merge_requests_approval_rules.rb create mode 100644 db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb create mode 100644 db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb create mode 100644 db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb create mode 100644 db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb create mode 100644 db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb create mode 100644 db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb create mode 100644 db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb create mode 100644 db/migrate/20241030190516_add_references_to_approval_rules.rb create mode 100644 db/migrate/20241031120607_remove_approval_rule_references.rb create mode 100644 db/schema_migrations/20241030105355 create mode 100644 db/schema_migrations/20241030105509 create mode 100644 db/schema_migrations/20241030105510 create mode 100644 db/schema_migrations/20241030105539 create mode 100644 db/schema_migrations/20241030105540 create mode 100644 db/schema_migrations/20241030105638 create mode 100644 db/schema_migrations/20241030162939 create mode 100644 db/schema_migrations/20241030183831 create mode 100644 db/schema_migrations/20241030190516 create mode 100644 db/schema_migrations/20241031120607 create mode 100644 ee/app/models/merge_requests/approval_group_rule.rb create mode 100644 ee/app/models/merge_requests/approval_merge_request_rule.rb create mode 100644 ee/app/models/merge_requests/approval_project_rule.rb create mode 100644 ee/app/models/merge_requests/approval_rule.rb create mode 100644 ee/spec/factories/merge_requests/approval_group_rules.rb create mode 100644 ee/spec/factories/merge_requests/approval_merge_request_rules.rb create mode 100644 ee/spec/factories/merge_requests/approval_project_rules.rb create mode 100644 ee/spec/factories/merge_requests/approval_rules.rb create mode 100644 ee/spec/models/merge_requests/approval_group_rule_spec.rb create mode 100644 ee/spec/models/merge_requests/approval_merge_request_rule_spec.rb create mode 100644 ee/spec/models/merge_requests/approval_project_rule_spec.rb create mode 100644 ee/spec/models/merge_requests/approval_rule_spec.rb diff --git a/db/docs/approval_group_rules.yml b/db/docs/approval_group_rules.yml index 3b5081c068bfbb..632a48c686045f 100644 --- a/db/docs/approval_group_rules.yml +++ b/db/docs/approval_group_rules.yml @@ -2,6 +2,7 @@ table_name: approval_group_rules classes: - ApprovalRules::ApprovalGroupRule +- MergeRequests::ApprovalGroupRule feature_categories: - source_code_management description: Keeps approval group rules diff --git a/db/docs/approval_merge_request_rules.yml b/db/docs/approval_merge_request_rules.yml index fdda6c8da1ef59..0a509d677a593b 100644 --- a/db/docs/approval_merge_request_rules.yml +++ b/db/docs/approval_merge_request_rules.yml @@ -2,6 +2,7 @@ table_name: approval_merge_request_rules classes: - ApprovalMergeRequestRule +- MergeRequests::ApprovalMergeRequestRule feature_categories: - code_review_workflow description: Keeps approval merge request rules diff --git a/db/docs/approval_project_rules.yml b/db/docs/approval_project_rules.yml index 730c8b2c5c7ad7..3a20c38431415b 100644 --- a/db/docs/approval_project_rules.yml +++ b/db/docs/approval_project_rules.yml @@ -2,6 +2,7 @@ table_name: approval_project_rules classes: - ApprovalProjectRule +- MergeRequests::ApprovalProjectRule feature_categories: - source_code_management description: Keeps approval project rules diff --git a/db/docs/merge_requests_approval_group_rules.yml b/db/docs/merge_requests_approval_group_rules.yml new file mode 100644 index 00000000000000..8f0d51e4374048 --- /dev/null +++ b/db/docs/merge_requests_approval_group_rules.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_group_rules +classes: +- MergeRequests::ApprovalGroupRule +- MergeRequestsApprovalGroupRule +feature_categories: +- todo +description: TODO +introduced_by_url: TODO +milestone: '17.6' +gitlab_schema: gitlab_main diff --git a/db/docs/merge_requests_approval_merge_request_rules.yml b/db/docs/merge_requests_approval_merge_request_rules.yml new file mode 100644 index 00000000000000..79e670e3386e22 --- /dev/null +++ b/db/docs/merge_requests_approval_merge_request_rules.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_merge_request_rules +classes: +- MergeRequests::ApprovalMergeRequestRule +- MergeRequestsApprovalMergeRequestRule +feature_categories: +- todo +description: TODO +introduced_by_url: TODO +milestone: '17.6' +gitlab_schema: gitlab_main diff --git a/db/docs/merge_requests_approval_project_rules.yml b/db/docs/merge_requests_approval_project_rules.yml new file mode 100644 index 00000000000000..486d4872e8b81a --- /dev/null +++ b/db/docs/merge_requests_approval_project_rules.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_project_rules +classes: +- MergeRequests::ApprovalProjectRule +- MergeRequestsApprovalProjectRule +feature_categories: +- todo +description: TODO +introduced_by_url: TODO +milestone: '17.6' +gitlab_schema: gitlab_main diff --git a/db/docs/merge_requests_approval_rules.yml b/db/docs/merge_requests_approval_rules.yml new file mode 100644 index 00000000000000..6b7f8133ba4e76 --- /dev/null +++ b/db/docs/merge_requests_approval_rules.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules +classes: +- MergeRequests::ApprovalRule +- MergeRequestsApprovalRule +feature_categories: +- todo +description: TODO +introduced_by_url: TODO +milestone: '17.6' +gitlab_schema: gitlab_main diff --git a/db/migrate/20241030105355_create_merge_requests_approval_rules.rb b/db/migrate/20241030105355_create_merge_requests_approval_rules.rb new file mode 100644 index 00000000000000..e7d7df9fc15b3a --- /dev/null +++ b/db/migrate/20241030105355_create_merge_requests_approval_rules.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. +class CreateMergeRequestsApprovalRules < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + create_table :merge_requests_approval_rules do |t| + t.integer :approvals_required, null: false, default: 0 + t.text :name, limit: 255, null: false + t.integer :rule_type, null: false, default: 0 + + t.belongs_to( + :source_rule, + foreign_key: { to_table: :merge_requests_approval_rules, on_delete: :nullify }, + index: { name: 'index_approval_rules_on_source_rule_id' } + ) + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb b/db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb new file mode 100644 index 00000000000000..da390986676968 --- /dev/null +++ b/db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalProjectRules < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + create_table :merge_requests_approval_project_rules do |t| + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_project_rules_on_approval_rule_id' } + ) + t.belongs_to :project, foreign_key: false + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb b/db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb new file mode 100644 index 00000000000000..b537b8b2aaaa28 --- /dev/null +++ b/db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateFkForMergeRequestsApprovalProjectRules < Gitlab::Database::Migration[2.2] + APPROVAL_RULE_INDEX = 'index_approval_project_rules_on_approval_rule_id' + milestone '17.6' + disable_ddl_transaction! + + def up + add_concurrent_foreign_key( + :merge_requests_approval_project_rules, :projects, column: :project_id, on_delete: :cascade + ) + end + + def down + with_lock_retries do + remove_foreign_key :merge_requests_approval_project_rules, column: :project_id + end + end +end diff --git a/db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb b/db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb new file mode 100644 index 00000000000000..2fbf2fd05830e3 --- /dev/null +++ b/db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalGroupRules < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + create_table :merge_requests_approval_group_rules do |t| + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_group_rules_on_approval_rule_id' } + ) + t.belongs_to :group, foreign_key: false + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb b/db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb new file mode 100644 index 00000000000000..5a46dd624a14cd --- /dev/null +++ b/db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateFkForMergeRequestsApprovalGroupRules < Gitlab::Database::Migration[2.2] + disable_ddl_transaction! + milestone '17.6' + + def up + add_concurrent_foreign_key( + :merge_requests_approval_group_rules, :namespaces, column: :group_id, on_delete: :cascade + ) + end + + def down + with_lock_retries do + remove_foreign_key :merge_requests_approval_group_rules, column: :group_id + end + end +end diff --git a/db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb b/db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb new file mode 100644 index 00000000000000..bd7f638b0c7484 --- /dev/null +++ b/db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalMergeRequestRules < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + create_table :merge_requests_approval_merge_request_rules do |t| + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_merge_request_rules_on_approval_rule_id' } + ) + + t.belongs_to( + :merge_request, + foreign_key: false, + index: { name: 'index_approval_merge_request_rules_on_merge_request_id' } + ) + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb b/db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb new file mode 100644 index 00000000000000..b645bf3d3e71b7 --- /dev/null +++ b/db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateFkForMergeRequestsApprovalMergeRequestRules < Gitlab::Database::Migration[2.2] + disable_ddl_transaction! + milestone '17.6' + + def up + add_concurrent_foreign_key( + :merge_requests_approval_merge_request_rules, :merge_requests, column: :merge_request_id, on_delete: :cascade + ) + end + + def down + with_lock_retries do + remove_foreign_key :merge_requests_approval_merge_request_rules, column: :merge_request_id + end + end +end diff --git a/db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb b/db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb new file mode 100644 index 00000000000000..f8e711861b5c50 --- /dev/null +++ b/db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class StoreOriginInMergeRequestsApprovalRules < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + add_column :merge_requests_approval_rules, :origin, :smallint, default: 0, null: false + end +end diff --git a/db/migrate/20241030190516_add_references_to_approval_rules.rb b/db/migrate/20241030190516_add_references_to_approval_rules.rb new file mode 100644 index 00000000000000..944c9186737811 --- /dev/null +++ b/db/migrate/20241030190516_add_references_to_approval_rules.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddReferencesToApprovalRules < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + add_belongs_to( + :merge_requests_approval_rules, :group, + foreign_key: { to_table: :namespaces, on_delete: :cascade }, + index: { name: 'index_approval_rules_on_group_id' } + ) + add_belongs_to( + :merge_requests_approval_rules, :project, + foreign_key: { on_delete: :cascade }, + index: { name: 'index_approval_rules_on_project_id' } + ) + add_belongs_to( + :merge_requests_approval_rules, :merge_request, + foreign_key: { on_delete: :cascade }, + index: { name: 'index_approval_rules_on_merge_request_id' } + ) + end +end diff --git a/db/migrate/20241031120607_remove_approval_rule_references.rb b/db/migrate/20241031120607_remove_approval_rule_references.rb new file mode 100644 index 00000000000000..1545315fff2835 --- /dev/null +++ b/db/migrate/20241031120607_remove_approval_rule_references.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class RemoveApprovalRuleReferences < Gitlab::Database::Migration[2.2] + milestone '17.6' + + def change + remove_belongs_to( + :merge_requests_approval_rules, :group, + foreign_key: { to_table: :namespaces, on_delete: :cascade }, + index: { name: 'index_approval_rules_on_group_id' } + ) + remove_belongs_to( + :merge_requests_approval_rules, :project, + foreign_key: { on_delete: :cascade }, + index: { name: 'index_approval_rules_on_project_id' } + ) + remove_belongs_to( + :merge_requests_approval_rules, :merge_request, + foreign_key: { on_delete: :cascade }, + index: { name: 'index_approval_rules_on_merge_request_id' } + ) + end +end diff --git a/db/schema_migrations/20241030105355 b/db/schema_migrations/20241030105355 new file mode 100644 index 00000000000000..d8b66cadd38d5a --- /dev/null +++ b/db/schema_migrations/20241030105355 @@ -0,0 +1 @@ +4e6a37ebc676bdf5c19ba2eb67a5a6f532d223ae8d73394a129c9a25550e6a0f \ No newline at end of file diff --git a/db/schema_migrations/20241030105509 b/db/schema_migrations/20241030105509 new file mode 100644 index 00000000000000..18f03d5c23d218 --- /dev/null +++ b/db/schema_migrations/20241030105509 @@ -0,0 +1 @@ +1bb00e9189f920df023d316d842bbabb8532b1a04e70576d3bfb5df86bbc5410 \ No newline at end of file diff --git a/db/schema_migrations/20241030105510 b/db/schema_migrations/20241030105510 new file mode 100644 index 00000000000000..1191c241fcc58a --- /dev/null +++ b/db/schema_migrations/20241030105510 @@ -0,0 +1 @@ +599473af1b3ce8be1cbc9a5ed9c8554c9346f67d7acb90fb3333f59f63b99f28 \ No newline at end of file diff --git a/db/schema_migrations/20241030105539 b/db/schema_migrations/20241030105539 new file mode 100644 index 00000000000000..39f8a15c418489 --- /dev/null +++ b/db/schema_migrations/20241030105539 @@ -0,0 +1 @@ +c053f0153fcd75812f63c5d25974afcfda985914616b107183ce54801ad4df17 \ No newline at end of file diff --git a/db/schema_migrations/20241030105540 b/db/schema_migrations/20241030105540 new file mode 100644 index 00000000000000..bf33c743e102eb --- /dev/null +++ b/db/schema_migrations/20241030105540 @@ -0,0 +1 @@ +330177b3b3ff622f469b9c841a0a2c3a168bb91eff3f54a74497dbf1c036166e \ No newline at end of file diff --git a/db/schema_migrations/20241030105638 b/db/schema_migrations/20241030105638 new file mode 100644 index 00000000000000..a3554954018e5f --- /dev/null +++ b/db/schema_migrations/20241030105638 @@ -0,0 +1 @@ +8b93f9e57d4ef0b3b449d083d4c842a007a3b5511d9bbdb69e2d71fbc472cc84 \ No newline at end of file diff --git a/db/schema_migrations/20241030162939 b/db/schema_migrations/20241030162939 new file mode 100644 index 00000000000000..021f822769be52 --- /dev/null +++ b/db/schema_migrations/20241030162939 @@ -0,0 +1 @@ +7d9df6fbb0f9e260fc70b811d3796814348b9d634cbd7b7c851542fc49b1c3be \ No newline at end of file diff --git a/db/schema_migrations/20241030183831 b/db/schema_migrations/20241030183831 new file mode 100644 index 00000000000000..4c0cba6b199b8b --- /dev/null +++ b/db/schema_migrations/20241030183831 @@ -0,0 +1 @@ +d0ae916dcfa6d419fbf6d6c0771740160f2f01c583d1e3c7506eeffe45a49aca \ No newline at end of file diff --git a/db/schema_migrations/20241030190516 b/db/schema_migrations/20241030190516 new file mode 100644 index 00000000000000..80bbf500e5bc3d --- /dev/null +++ b/db/schema_migrations/20241030190516 @@ -0,0 +1 @@ +00f8efddb6107e7ead8c33040f7a4b6fdc5c7be5e6ae6029a317fbad8663238a \ No newline at end of file diff --git a/db/schema_migrations/20241031120607 b/db/schema_migrations/20241031120607 new file mode 100644 index 00000000000000..b9ca662cc3eceb --- /dev/null +++ b/db/schema_migrations/20241031120607 @@ -0,0 +1 @@ +e4e7ae7833eee201f96b148632899315d91c905904b695aec2a0ce58587b0b84 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 156626122a3023..dacc2325b22d7b 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -14625,6 +14625,78 @@ CREATE TABLE merge_requests ( CONSTRAINT check_970d272570 CHECK ((lock_version IS NOT NULL)) ); +CREATE TABLE merge_requests_approval_group_rules ( + id bigint NOT NULL, + approval_rule_id bigint, + group_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +CREATE SEQUENCE merge_requests_approval_group_rules_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_group_rules_id_seq OWNED BY merge_requests_approval_group_rules.id; + +CREATE TABLE merge_requests_approval_merge_request_rules ( + id bigint NOT NULL, + approval_rule_id bigint, + merge_request_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +CREATE SEQUENCE merge_requests_approval_merge_request_rules_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_merge_request_rules_id_seq OWNED BY merge_requests_approval_merge_request_rules.id; + +CREATE TABLE merge_requests_approval_project_rules ( + id bigint NOT NULL, + approval_rule_id bigint, + project_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +CREATE SEQUENCE merge_requests_approval_project_rules_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_project_rules_id_seq OWNED BY merge_requests_approval_project_rules.id; + +CREATE TABLE merge_requests_approval_rules ( + id bigint NOT NULL, + approvals_required integer DEFAULT 0 NOT NULL, + name text NOT NULL, + rule_type integer DEFAULT 0 NOT NULL, + source_rule_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL, + origin smallint DEFAULT 0 NOT NULL, + CONSTRAINT check_c7c36145b7 CHECK ((char_length(name) <= 255)) +); + +CREATE SEQUENCE merge_requests_approval_rules_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_rules_id_seq OWNED BY merge_requests_approval_rules.id; + CREATE TABLE merge_requests_closing_issues ( id bigint NOT NULL, merge_request_id bigint NOT NULL, @@ -23517,6 +23589,14 @@ ALTER TABLE ONLY merge_request_user_mentions ALTER COLUMN id SET DEFAULT nextval ALTER TABLE ONLY merge_requests ALTER COLUMN id SET DEFAULT nextval('merge_requests_id_seq'::regclass); +ALTER TABLE ONLY merge_requests_approval_group_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_group_rules_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_merge_request_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_merge_request_rules_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_project_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_project_rules_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_id_seq'::regclass); + ALTER TABLE ONLY merge_requests_closing_issues ALTER COLUMN id SET DEFAULT nextval('merge_requests_closing_issues_id_seq'::regclass); ALTER TABLE ONLY merge_requests_compliance_violations ALTER COLUMN id SET DEFAULT nextval('merge_requests_compliance_violations_id_seq'::regclass); @@ -25917,6 +25997,18 @@ ALTER TABLE ONLY merge_request_reviewers ALTER TABLE ONLY merge_request_user_mentions ADD CONSTRAINT merge_request_user_mentions_pkey PRIMARY KEY (id); +ALTER TABLE ONLY merge_requests_approval_group_rules + ADD CONSTRAINT merge_requests_approval_group_rules_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_merge_request_rules + ADD CONSTRAINT merge_requests_approval_merge_request_rules_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_project_rules + ADD CONSTRAINT merge_requests_approval_project_rules_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_rules + ADD CONSTRAINT merge_requests_approval_rules_pkey PRIMARY KEY (id); + ALTER TABLE ONLY merge_requests_closing_issues ADD CONSTRAINT merge_requests_closing_issues_pkey PRIMARY KEY (id); @@ -28957,6 +29049,8 @@ CREATE INDEX index_approval_group_rules_groups_on_group_id ON approval_group_rul CREATE INDEX index_approval_group_rules_on_approval_policy_rule_id ON approval_group_rules USING btree (approval_policy_rule_id); +CREATE INDEX index_approval_group_rules_on_approval_rule_id ON merge_requests_approval_group_rules USING btree (approval_rule_id); + CREATE INDEX index_approval_group_rules_on_scan_result_policy_id ON approval_group_rules USING btree (scan_result_policy_id); CREATE INDEX index_approval_group_rules_protected_branches_on_group_id ON approval_group_rules_protected_branches USING btree (group_id); @@ -28981,6 +29075,10 @@ CREATE INDEX index_approval_merge_request_rules_groups_2 ON approval_merge_reque CREATE INDEX index_approval_merge_request_rules_on_approval_policy_rule_id ON approval_merge_request_rules USING btree (approval_policy_rule_id); +CREATE INDEX index_approval_merge_request_rules_on_approval_rule_id ON merge_requests_approval_merge_request_rules USING btree (approval_rule_id); + +CREATE INDEX index_approval_merge_request_rules_on_merge_request_id ON merge_requests_approval_merge_request_rules USING btree (merge_request_id); + CREATE INDEX index_approval_merge_request_rules_on_project_id ON approval_merge_request_rules USING btree (project_id); CREATE UNIQUE INDEX index_approval_merge_request_rules_users_1 ON approval_merge_request_rules_users USING btree (approval_merge_request_rule_id, user_id); @@ -29003,6 +29101,8 @@ CREATE INDEX index_approval_project_rules_groups_2 ON approval_project_rules_gro CREATE INDEX index_approval_project_rules_on_approval_policy_rule_id ON approval_project_rules USING btree (approval_policy_rule_id); +CREATE INDEX index_approval_project_rules_on_approval_rule_id ON merge_requests_approval_project_rules USING btree (approval_rule_id); + CREATE INDEX index_approval_project_rules_on_id_with_regular_type ON approval_project_rules USING btree (id) WHERE (rule_type = 0); CREATE INDEX index_approval_project_rules_on_project_id_and_rule_type ON approval_project_rules USING btree (project_id, rule_type); @@ -29031,6 +29131,14 @@ CREATE INDEX index_approval_rule_on_protected_environment_id ON protected_enviro CREATE INDEX index_approval_rules_code_owners_rule_type ON approval_merge_request_rules USING btree (merge_request_id) WHERE (rule_type = 2); +CREATE INDEX index_approval_rules_on_group_id ON merge_requests_approval_rules USING btree (group_id); + +CREATE INDEX index_approval_rules_on_merge_request_id ON merge_requests_approval_rules USING btree (merge_request_id); + +CREATE INDEX index_approval_rules_on_project_id ON merge_requests_approval_rules USING btree (project_id); + +CREATE INDEX index_approval_rules_on_source_rule_id ON merge_requests_approval_rules USING btree (source_rule_id); + CREATE INDEX index_approvals_on_merge_request_id_and_created_at ON approvals USING btree (merge_request_id, created_at); CREATE UNIQUE INDEX index_approvals_on_user_id_and_merge_request_id ON approvals USING btree (user_id, merge_request_id); @@ -30929,6 +31037,10 @@ CREATE INDEX index_merge_request_reviewers_on_user_id ON merge_request_reviewers CREATE UNIQUE INDEX index_merge_request_user_mentions_on_note_id ON merge_request_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL); +CREATE INDEX index_merge_requests_approval_group_rules_on_group_id ON merge_requests_approval_group_rules USING btree (group_id); + +CREATE INDEX index_merge_requests_approval_project_rules_on_project_id ON merge_requests_approval_project_rules USING btree (project_id); + CREATE INDEX index_merge_requests_closing_issues_on_issue_id ON merge_requests_closing_issues USING btree (issue_id); CREATE INDEX index_merge_requests_closing_issues_on_merge_request_id ON merge_requests_closing_issues USING btree (merge_request_id); @@ -35572,6 +35684,9 @@ ALTER TABLE ONLY approval_project_rules_users ALTER TABLE ONLY security_policy_project_links ADD CONSTRAINT fk_0eba4d5d71 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_merge_request_rules + ADD CONSTRAINT fk_0f06ebd650 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; + ALTER TABLE ONLY deployment_approvals ADD CONSTRAINT fk_0f58311058 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; @@ -35653,6 +35768,9 @@ ALTER TABLE ONLY project_statistics ALTER TABLE ONLY issues ADD CONSTRAINT fk_1adaba52b0 FOREIGN KEY (correct_work_item_type_id) REFERENCES work_item_types(correct_id); +ALTER TABLE ONLY merge_requests_approval_group_rules + ADD CONSTRAINT fk_1c1190a413 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; + ALTER TABLE ONLY approval_policy_rule_project_links ADD CONSTRAINT fk_1c78796d52 FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE; @@ -35749,6 +35867,9 @@ ALTER TABLE ONLY resource_link_events ALTER TABLE ONLY ml_candidates ADD CONSTRAINT fk_2a0421d824 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_project_rules + ADD CONSTRAINT fk_2a541f65d4 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; + ALTER TABLE ONLY approval_group_rules ADD CONSTRAINT fk_2a74c6e52d FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE; @@ -37180,6 +37301,9 @@ ALTER TABLE ONLY automation_rules ALTER TABLE ONLY incident_management_oncall_participants ADD CONSTRAINT fk_rails_032b12996a FOREIGN KEY (oncall_rotation_id) REFERENCES incident_management_oncall_rotations(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules + ADD CONSTRAINT fk_rails_03983bf729 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; + ALTER TABLE ONLY events ADD CONSTRAINT fk_rails_0434b48643 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; @@ -37258,6 +37382,9 @@ ALTER TABLE ONLY issue_email_participants ALTER TABLE ONLY merge_request_context_commits ADD CONSTRAINT fk_rails_0fe0039f60 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_group_rules + ADD CONSTRAINT fk_rails_1050c8bc82 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY audit_events_streaming_headers ADD CONSTRAINT fk_rails_109fcf96e2 FOREIGN KEY (external_audit_event_destination_id) REFERENCES audit_events_external_audit_event_destinations(id) ON DELETE CASCADE; @@ -37294,6 +37421,9 @@ ALTER TABLE ONLY diff_note_positions ALTER TABLE ONLY analytics_cycle_analytics_aggregations ADD CONSTRAINT fk_rails_13c8374c7a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_merge_request_rules + ADD CONSTRAINT fk_rails_13fbeb2152 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY service_desk_custom_email_verifications ADD CONSTRAINT fk_rails_14dcaf4c92 FOREIGN KEY (triggerer_id) REFERENCES users(id) ON DELETE SET NULL; @@ -37678,6 +37808,9 @@ ALTER TABLE ONLY protected_environment_deploy_access_levels ALTER TABLE ONLY smartcard_identities ADD CONSTRAINT fk_rails_4689f889a9 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_project_rules + ADD CONSTRAINT fk_rails_46fc7ba87f FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY user_custom_attributes ADD CONSTRAINT fk_rails_47b91868a8 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; @@ -37978,6 +38111,9 @@ ALTER TABLE ci_runner_taggings ALTER TABLE ONLY term_agreements ADD CONSTRAINT fk_rails_6ea6520e4a FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules + ADD CONSTRAINT fk_rails_6eaf7990e8 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; + ALTER TABLE ONLY project_compliance_framework_settings ADD CONSTRAINT fk_rails_6f5294f16c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; @@ -38074,6 +38210,9 @@ ALTER TABLE ONLY operations_scopes ALTER TABLE ONLY milestone_releases ADD CONSTRAINT fk_rails_7ae0756a2d FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules + ADD CONSTRAINT fk_rails_7af76dbd21 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; + ALTER TABLE ONLY scan_execution_policy_rules ADD CONSTRAINT fk_rails_7be2571ecf FOREIGN KEY (security_policy_id) REFERENCES security_policies(id) ON DELETE CASCADE; @@ -39019,6 +39158,9 @@ ALTER TABLE ONLY merge_requests_closing_issues ALTER TABLE p_ci_job_artifact_reports ADD CONSTRAINT fk_rails_f9b8550174 FOREIGN KEY (partition_id, job_artifact_id) REFERENCES p_ci_job_artifacts(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules + ADD CONSTRAINT fk_rails_fa5b38e373 FOREIGN KEY (source_rule_id) REFERENCES merge_requests_approval_rules(id) ON DELETE SET NULL; + ALTER TABLE ONLY banned_users ADD CONSTRAINT fk_rails_fa5bb598e5 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; diff --git a/ee/app/models/ee/group.rb b/ee/app/models/ee/group.rb index 50c08007bd1572..e7f92ebaf66d6e 100644 --- a/ee/app/models/ee/group.rb +++ b/ee/app/models/ee/group.rb @@ -30,6 +30,9 @@ module Group add_authentication_token_field :saml_discovery_token, unique: false, token_generator: -> { Devise.friendly_token(8) } # rubocop:disable Gitlab/TokenWithoutPrefix -- wontfix; not used for authentication + has_many :v2_approval_group_rules, class_name: 'MergeRequests::ApprovalGroupRule', inverse_of: :group + has_many :v2_approval_rules, through: :v2_approval_group_rules, class_name: 'MergeRequests::ApprovalRule', source: :approval_rule + has_many :epics has_many :epic_boards, class_name: 'Boards::EpicBoard', inverse_of: :group has_many :iterations diff --git a/ee/app/models/ee/merge_request.rb b/ee/app/models/ee/merge_request.rb index f6f3cfb43cba0e..87f5d5f7da1e82 100644 --- a/ee/app/models/ee/merge_request.rb +++ b/ee/app/models/ee/merge_request.rb @@ -27,7 +27,10 @@ module MergeRequest belongs_to :iteration, foreign_key: 'sprint_id', inverse_of: :merge_requests - has_many :approvers, as: :target, dependent: :delete_all + has_many :v2_approval_merge_request_rules, class_name: 'MergeRequests::ApprovalMergeRequestRule', inverse_of: :merge_request + has_many :v2_approval_rules, through: :v2_approval_merge_request_rules, class_name: 'MergeRequests::ApprovalRule', source: :approval_rule + + has_many :approvers, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent has_many :approver_users, through: :approvers, source: :user has_many :approver_groups, as: :target, dependent: :delete_all has_many :status_check_responses, class_name: 'MergeRequests::StatusCheckResponse', inverse_of: :merge_request diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb index db53f5bc59ce0f..edc19ea950f49d 100644 --- a/ee/app/models/ee/project.rb +++ b/ee/app/models/ee/project.rb @@ -83,7 +83,10 @@ def preload_protected_branches has_many :zoekt_repositories, class_name: '::Search::Zoekt::Repository', inverse_of: :project has_one :secrets_manager, class_name: '::SecretsManagement::ProjectSecretsManager' - has_many :approvers, as: :target, dependent: :destroy + has_many :v2_approval_project_rules, class_name: 'MergeRequests::ApprovalProjectRule', inverse_of: :project + has_many :v2_approval_rules, through: :v2_approval_project_rules, class_name: 'MergeRequests::ApprovalRule', source: :approval_rule + + has_many :approvers, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :approver_users, through: :approvers, source: :user has_many :approver_groups, as: :target, dependent: :destroy has_many :approval_rules, class_name: 'ApprovalProjectRule', extend: FilterByBranch diff --git a/ee/app/models/merge_requests/approval_group_rule.rb b/ee/app/models/merge_requests/approval_group_rule.rb new file mode 100644 index 00000000000000..9ca6783f1ee9ca --- /dev/null +++ b/ee/app/models/merge_requests/approval_group_rule.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalGroupRule < ApplicationRecord + self.table_name = 'merge_requests_approval_group_rules' + belongs_to :approval_rule + belongs_to :group + end +end diff --git a/ee/app/models/merge_requests/approval_merge_request_rule.rb b/ee/app/models/merge_requests/approval_merge_request_rule.rb new file mode 100644 index 00000000000000..1fd749c34f07bf --- /dev/null +++ b/ee/app/models/merge_requests/approval_merge_request_rule.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalMergeRequestRule < ApplicationRecord + self.table_name = 'merge_requests_approval_merge_request_rules' + belongs_to :merge_request + belongs_to :approval_rule + end +end diff --git a/ee/app/models/merge_requests/approval_project_rule.rb b/ee/app/models/merge_requests/approval_project_rule.rb new file mode 100644 index 00000000000000..5a1742762b32ae --- /dev/null +++ b/ee/app/models/merge_requests/approval_project_rule.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalProjectRule < ApplicationRecord + self.table_name = 'merge_requests_approval_project_rules' + belongs_to :approval_rule + belongs_to :project + end +end diff --git a/ee/app/models/merge_requests/approval_rule.rb b/ee/app/models/merge_requests/approval_rule.rb new file mode 100644 index 00000000000000..c78616a241f7f6 --- /dev/null +++ b/ee/app/models/merge_requests/approval_rule.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRule < ApplicationRecord + self.table_name = 'merge_requests_approval_rules' + # When this originated_from_group there's only one group + has_one :approval_group_rule, inverse_of: :approval_rule + has_one :group, through: :approval_group_rule + + # If we allow overriding in subgroups we can add groups association + # has_many :approval_group_rules + # has_many :groups, through: :approval_group_rules + + # When this originated_from_project there's only one project + has_one :approval_project_rule, inverse_of: :approval_rule + has_one :project, through: :approval_project_rule + + # When this originated_from_group there are multiple projects + has_many :approval_project_rules + has_many :projects, through: :approval_project_rules + + # When this originated_from_merge_request there's only one merge_request + has_many :approval_merge_request_rule, inverse_of: :approval_rule + has_many :merge_request, through: :approval_merge_request_rule + + # When this originated_from_project there are multiple merge_requests + has_many :approval_merge_request_rules + has_many :merge_requests, through: :approval_merge_request_rules + + with_options validate: true do + enum :rule_type, { regular: 0, code_owner: 1, report_approver: 2, any_approver: 3 }, default: :regular + enum :origin, { group: 0, project: 1, merge_request: 2 }, prefix: :originates_from + end + + def self.generate_group_rule(group) + create!( + name: "Group Rule (#{group.full_path})", + approvals_required: rand(0..10), + rule_type: :regular, + origin: :group, + group: group, + projects: projects = group.self_and_descendants.flat_map(&:projects), + merge_requests: projects.flat_map(&:merge_requests) + ) + end + + def self.generate_project_rule(project) + create!( + name: "Project Rule (#{project.full_path})", + approvals_required: rand(0..10), + rule_type: :regular, + origin: :project, + project: project, + merge_requests: project.merge_requests + ) + end + + def self.generate_merge_request_rule(merge_request) + create!( + name: "Merge Request Rule (#{merge_request.id})", + approvals_required: rand(0..10), + rule_type: :regular, + origin: :merge_request, + merge_request: merge_request + ) + end + + def self.destroy_everything + find_each do |rule| + rule.approval_group_rule.destroy + rule.approval_project_rules.delete_all + rule.approval_merge_request_rules.delete_all + rule.destroy + end + end + end +end diff --git a/ee/spec/factories/merge_requests/approval_group_rules.rb b/ee/spec/factories/merge_requests/approval_group_rules.rb new file mode 100644 index 00000000000000..2c02035010d914 --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_group_rules.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_group_rule, class: 'MergeRequests::ApprovalGroupRule' do + association :approval_rule, factory: :merge_requests_approval_rule + association :group, factory: :group + end +end diff --git a/ee/spec/factories/merge_requests/approval_merge_request_rules.rb b/ee/spec/factories/merge_requests/approval_merge_request_rules.rb new file mode 100644 index 00000000000000..a2a055cf76ee89 --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_merge_request_rules.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_merge_request_rule, class: 'MergeRequests::ApprovalMergeRequestRule' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_project_rules.rb b/ee/spec/factories/merge_requests/approval_project_rules.rb new file mode 100644 index 00000000000000..76e1df667f0907 --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_project_rules.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_project_rule, class: 'MergeRequests::ApprovalProjectRule' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_rules.rb b/ee/spec/factories/merge_requests/approval_rules.rb new file mode 100644 index 00000000000000..033c7435bb93da --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rule, class: 'MergeRequests::ApprovalRule' do + name { generate(:short_text) } + end +end diff --git a/ee/spec/models/merge_requests/approval_group_rule_spec.rb b/ee/spec/models/merge_requests/approval_group_rule_spec.rb new file mode 100644 index 00000000000000..f50c2ff44f8860 --- /dev/null +++ b/ee/spec/models/merge_requests/approval_group_rule_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe MergeRequests::ApprovalGroupRule, type: :model, feature_category: :source_code_management do + describe 'associations' do + subject { build(:merge_requests_approval_group_rule) } + + it { is_expected.to belong_to(:group) } + it { is_expected.to belong_to(:approval_rule) } + end +end diff --git a/ee/spec/models/merge_requests/approval_merge_request_rule_spec.rb b/ee/spec/models/merge_requests/approval_merge_request_rule_spec.rb new file mode 100644 index 00000000000000..7fae275ff36acb --- /dev/null +++ b/ee/spec/models/merge_requests/approval_merge_request_rule_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe MergeRequests::ApprovalMergeRequestRule, type: :model, feature_category: :source_code_management do + describe 'associations' do + subject { build(:merge_requests_approval_merge_request_rule) } + + it { is_expected.to belong_to(:merge_request) } + it { is_expected.to belong_to(:approval_rule) } + end +end diff --git a/ee/spec/models/merge_requests/approval_project_rule_spec.rb b/ee/spec/models/merge_requests/approval_project_rule_spec.rb new file mode 100644 index 00000000000000..1ba5967d01f58e --- /dev/null +++ b/ee/spec/models/merge_requests/approval_project_rule_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe MergeRequests::ApprovalProjectRule, type: :model, feature_category: :source_code_management do + describe 'associations' do + subject { build(:merge_requests_approval_project_rule) } + + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:approval_rule) } + end +end diff --git a/ee/spec/models/merge_requests/approval_rule_spec.rb b/ee/spec/models/merge_requests/approval_rule_spec.rb new file mode 100644 index 00000000000000..786e1898d817d5 --- /dev/null +++ b/ee/spec/models/merge_requests/approval_rule_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe MergeRequests::ApprovalRule, type: :model, feature_category: :source_code_management do + describe 'associations' do + subject { build(:merge_requests_approval_rule) } + + it { is_expected.to have_many(:approval_group_rules) } + it { is_expected.to have_many(:groups).through(:approval_group_rules) } + it { is_expected.to have_many(:approval_project_rules) } + it { is_expected.to have_many(:projects).through(:approval_project_rules) } + it { is_expected.to have_many(:approval_merge_request_rules) } + it { is_expected.to have_many(:merge_requests).through(:approval_merge_request_rules) } + end +end -- GitLab From b9f9f7749bfe20e965a6b64dd0c22b281bc5572a Mon Sep 17 00:00:00 2001 From: ghinfey Date: Thu, 28 Nov 2024 11:55:50 +0000 Subject: [PATCH 2/2] Rename poc models as per blueprint and add additional tables --- ... merge_requests_approval_rules_groups.yml} | 6 +- ...equests_approval_rules_merge_requests.yml} | 4 +- ...erge_requests_approval_rules_projects.yml} | 6 +- ...ests_approval_rules_protected_branches.yml | 11 + ...s_approval_rules_security_policy_links.yml | 11 + ...ge_requests_approval_rules_user_groups.yml | 11 + .../merge_requests_approval_rules_users.yml | 11 + ...r_merge_requests_approval_project_rules.rb | 22 -- ...e_requests_approval_merge_request_rules.rb | 21 -- ...2_create_merge_requests_approval_rules.rb} | 2 +- ...merge_requests_approval_rules_projects.rb} | 8 +- ..._merge_requests_approval_rules_projects.rb | 22 ++ ...e_merge_requests_approval_rules_groups.rb} | 8 +- ...r_merge_requests_approval_rules_groups.rb} | 8 +- ...requests_approval_rules_merge_requests.rb} | 10 +- ..._requests_approval_rules_merge_requests.rb | 21 ++ ...rigin_in_merge_requests_approval_rules.rb} | 2 +- ...31943_add_references_to_approval_rules.rb} | 2 +- ...132004_remove_approval_rule_references.rb} | 2 +- ...ate_merge_requests_approval_rules_users.rb | 21 ++ ...rge_requests_approval_rules_user_groups.rb | 21 ++ ...uests_approval_rules_protected_branches.rb | 25 ++ ...quests_approval_rules_security_policies.rb | 23 ++ db/schema_migrations/20241030105355 | 1 - db/schema_migrations/20241030105509 | 1 - db/schema_migrations/20241030105510 | 1 - db/schema_migrations/20241030105539 | 1 - db/schema_migrations/20241030105540 | 1 - db/schema_migrations/20241030105638 | 1 - db/schema_migrations/20241030162939 | 1 - db/schema_migrations/20241030183831 | 1 - db/schema_migrations/20241030190516 | 1 - db/schema_migrations/20241031120607 | 1 - db/schema_migrations/20241128131702 | 1 + db/schema_migrations/20241128131722 | 1 + db/schema_migrations/20241128131741 | 1 + db/schema_migrations/20241128131801 | 1 + db/schema_migrations/20241128131821 | 1 + db/schema_migrations/20241128131843 | 1 + db/schema_migrations/20241128131904 | 1 + db/schema_migrations/20241128131924 | 1 + db/schema_migrations/20241128131943 | 1 + db/schema_migrations/20241128132004 | 1 + db/schema_migrations/20241128132024 | 1 + db/schema_migrations/20241128132045 | 1 + db/schema_migrations/20241128141642 | 1 + db/schema_migrations/20241128141707 | 1 + db/structure.sql | 241 +++++++++++++----- ee/app/models/ee/group.rb | 2 +- ee/app/models/ee/merge_request.rb | 8 +- ee/app/models/ee/project.rb | 4 +- .../approval_merge_request_rule.rb | 9 - ee/app/models/merge_requests/approval_rule.rb | 20 +- ..._group_rule.rb => approval_rules_group.rb} | 4 +- .../approval_rules_merge_request.rb | 9 + ...ject_rule.rb => approval_rules_project.rb} | 4 +- .../approval_rules_protected_branch.rb | 9 + .../approval_rules_security_policy_link.rb | 9 + .../merge_requests/approval_rules_user.rb | 9 + .../approval_rules_user_group.rb | 9 + .../approval_merge_request_rules.rb | 6 - .../merge_requests/approval_project_rules.rb | 6 - ...roup_rules.rb => approval_rules_groups.rb} | 2 +- .../approval_rules_merge_requests.rb | 6 + .../merge_requests/approval_rules_projects.rb | 6 + .../approval_rules_protected_branches.rb | 6 + .../approval_rules_security_policy_links.rb | 6 + .../approval_rules_user_groups.rb | 6 + .../merge_requests/approval_rules_users.rb | 6 + 69 files changed, 495 insertions(+), 194 deletions(-) rename db/docs/{merge_requests_approval_group_rules.yml => merge_requests_approval_rules_groups.yml} (51%) rename db/docs/{merge_requests_approval_merge_request_rules.yml => merge_requests_approval_rules_merge_requests.yml} (62%) rename db/docs/{merge_requests_approval_project_rules.yml => merge_requests_approval_rules_projects.yml} (50%) create mode 100644 db/docs/merge_requests_approval_rules_protected_branches.yml create mode 100644 db/docs/merge_requests_approval_rules_security_policy_links.yml create mode 100644 db/docs/merge_requests_approval_rules_user_groups.yml create mode 100644 db/docs/merge_requests_approval_rules_users.yml delete mode 100644 db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb delete mode 100644 db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb rename db/migrate/{20241030105355_create_merge_requests_approval_rules.rb => 20241128131702_create_merge_requests_approval_rules.rb} (85%) rename db/migrate/{20241030105509_create_merge_requests_approval_project_rules.rb => 20241128131722_create_merge_requests_approval_rules_projects.rb} (58%) create mode 100644 db/migrate/20241128131741_create_fk_for_merge_requests_approval_rules_projects.rb rename db/migrate/{20241030105539_create_merge_requests_approval_group_rules.rb => 20241128131801_create_merge_requests_approval_rules_groups.rb} (57%) rename db/migrate/{20241030105540_create_fk_for_merge_requests_approval_group_rules.rb => 20241128131821_create_fk_for_merge_requests_approval_rules_groups.rb} (51%) rename db/migrate/{20241030105638_create_merge_requests_approval_merge_request_rules.rb => 20241128131843_create_merge_requests_approval_rules_merge_requests.rb} (52%) create mode 100644 db/migrate/20241128131904_create_fk_for_merge_requests_approval_rules_merge_requests.rb rename db/migrate/{20241030183831_store_origin_in_merge_requests_approval_rules.rb => 20241128131924_store_origin_in_merge_requests_approval_rules.rb} (95%) rename db/migrate/{20241030190516_add_references_to_approval_rules.rb => 20241128131943_add_references_to_approval_rules.rb} (97%) rename db/migrate/{20241031120607_remove_approval_rule_references.rb => 20241128132004_remove_approval_rule_references.rb} (97%) create mode 100644 db/migrate/20241128132024_create_merge_requests_approval_rules_users.rb create mode 100644 db/migrate/20241128132045_create_merge_requests_approval_rules_user_groups.rb create mode 100644 db/migrate/20241128141642_create_merge_requests_approval_rules_protected_branches.rb create mode 100644 db/migrate/20241128141707_create_merge_requests_approval_rules_security_policies.rb delete mode 100644 db/schema_migrations/20241030105355 delete mode 100644 db/schema_migrations/20241030105509 delete mode 100644 db/schema_migrations/20241030105510 delete mode 100644 db/schema_migrations/20241030105539 delete mode 100644 db/schema_migrations/20241030105540 delete mode 100644 db/schema_migrations/20241030105638 delete mode 100644 db/schema_migrations/20241030162939 delete mode 100644 db/schema_migrations/20241030183831 delete mode 100644 db/schema_migrations/20241030190516 delete mode 100644 db/schema_migrations/20241031120607 create mode 100644 db/schema_migrations/20241128131702 create mode 100644 db/schema_migrations/20241128131722 create mode 100644 db/schema_migrations/20241128131741 create mode 100644 db/schema_migrations/20241128131801 create mode 100644 db/schema_migrations/20241128131821 create mode 100644 db/schema_migrations/20241128131843 create mode 100644 db/schema_migrations/20241128131904 create mode 100644 db/schema_migrations/20241128131924 create mode 100644 db/schema_migrations/20241128131943 create mode 100644 db/schema_migrations/20241128132004 create mode 100644 db/schema_migrations/20241128132024 create mode 100644 db/schema_migrations/20241128132045 create mode 100644 db/schema_migrations/20241128141642 create mode 100644 db/schema_migrations/20241128141707 delete mode 100644 ee/app/models/merge_requests/approval_merge_request_rule.rb rename ee/app/models/merge_requests/{approval_group_rule.rb => approval_rules_group.rb} (51%) create mode 100644 ee/app/models/merge_requests/approval_rules_merge_request.rb rename ee/app/models/merge_requests/{approval_project_rule.rb => approval_rules_project.rb} (50%) create mode 100644 ee/app/models/merge_requests/approval_rules_protected_branch.rb create mode 100644 ee/app/models/merge_requests/approval_rules_security_policy_link.rb create mode 100644 ee/app/models/merge_requests/approval_rules_user.rb create mode 100644 ee/app/models/merge_requests/approval_rules_user_group.rb delete mode 100644 ee/spec/factories/merge_requests/approval_merge_request_rules.rb delete mode 100644 ee/spec/factories/merge_requests/approval_project_rules.rb rename ee/spec/factories/merge_requests/{approval_group_rules.rb => approval_rules_groups.rb} (64%) create mode 100644 ee/spec/factories/merge_requests/approval_rules_merge_requests.rb create mode 100644 ee/spec/factories/merge_requests/approval_rules_projects.rb create mode 100644 ee/spec/factories/merge_requests/approval_rules_protected_branches.rb create mode 100644 ee/spec/factories/merge_requests/approval_rules_security_policy_links.rb create mode 100644 ee/spec/factories/merge_requests/approval_rules_user_groups.rb create mode 100644 ee/spec/factories/merge_requests/approval_rules_users.rb diff --git a/db/docs/merge_requests_approval_group_rules.yml b/db/docs/merge_requests_approval_rules_groups.yml similarity index 51% rename from db/docs/merge_requests_approval_group_rules.yml rename to db/docs/merge_requests_approval_rules_groups.yml index 8f0d51e4374048..c4cd0f81f90f7c 100644 --- a/db/docs/merge_requests_approval_group_rules.yml +++ b/db/docs/merge_requests_approval_rules_groups.yml @@ -1,8 +1,8 @@ --- -table_name: merge_requests_approval_group_rules +table_name: merge_requests_approval_rules_groups classes: -- MergeRequests::ApprovalGroupRule -- MergeRequestsApprovalGroupRule +- MergeRequests::ApprovalRulesGroup +- MergeRequestsApprovalRulesGroup feature_categories: - todo description: TODO diff --git a/db/docs/merge_requests_approval_merge_request_rules.yml b/db/docs/merge_requests_approval_rules_merge_requests.yml similarity index 62% rename from db/docs/merge_requests_approval_merge_request_rules.yml rename to db/docs/merge_requests_approval_rules_merge_requests.yml index 79e670e3386e22..ade8609939d950 100644 --- a/db/docs/merge_requests_approval_merge_request_rules.yml +++ b/db/docs/merge_requests_approval_rules_merge_requests.yml @@ -1,7 +1,7 @@ --- -table_name: merge_requests_approval_merge_request_rules +table_name: merge_requests_approval_rules_merge_requests classes: -- MergeRequests::ApprovalMergeRequestRule +- MergeRequests::ApprovalRulesMergeRequest - MergeRequestsApprovalMergeRequestRule feature_categories: - todo diff --git a/db/docs/merge_requests_approval_project_rules.yml b/db/docs/merge_requests_approval_rules_projects.yml similarity index 50% rename from db/docs/merge_requests_approval_project_rules.yml rename to db/docs/merge_requests_approval_rules_projects.yml index 486d4872e8b81a..5bf6062f898db6 100644 --- a/db/docs/merge_requests_approval_project_rules.yml +++ b/db/docs/merge_requests_approval_rules_projects.yml @@ -1,8 +1,8 @@ --- -table_name: merge_requests_approval_project_rules +table_name: merge_requests_approval_rules_projects classes: -- MergeRequests::ApprovalProjectRule -- MergeRequestsApprovalProjectRule +- MergeRequests::ApprovalRulesProject +- MergeRequestsApprovalRulesProject feature_categories: - todo description: TODO diff --git a/db/docs/merge_requests_approval_rules_protected_branches.yml b/db/docs/merge_requests_approval_rules_protected_branches.yml new file mode 100644 index 00000000000000..4c1bb8ddc6729d --- /dev/null +++ b/db/docs/merge_requests_approval_rules_protected_branches.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_protected_branches +classes: + - MergeRequests::ApprovalRulesProtectedBranch + - MergeRequestsApprovalRulesProtectedBranch +feature_categories: +- todo +description: TODO +introduced_by_url: TODO +milestone: '17.7' +gitlab_schema: gitlab_main diff --git a/db/docs/merge_requests_approval_rules_security_policy_links.yml b/db/docs/merge_requests_approval_rules_security_policy_links.yml new file mode 100644 index 00000000000000..b6534246c55989 --- /dev/null +++ b/db/docs/merge_requests_approval_rules_security_policy_links.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_security_policy_links +classes: + - MergeRequests::ApprovalRulesSecurityPolicyLink + - MergeRequestsApprovalRulesSecurityPolicyLink +feature_categories: + - todo +description: TODO +introduced_by_url: TODO +milestone: '17.7' +gitlab_schema: gitlab_main diff --git a/db/docs/merge_requests_approval_rules_user_groups.yml b/db/docs/merge_requests_approval_rules_user_groups.yml new file mode 100644 index 00000000000000..dc4b36dea44bc1 --- /dev/null +++ b/db/docs/merge_requests_approval_rules_user_groups.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_user_groups +classes: + - MergeRequests::ApprovalRulesUserGroups + - MergeRequestsApprovalRulesUserGroups +feature_categories: + - todo +description: TODO +introduced_by_url: TODO +milestone: '17.7' +gitlab_schema: gitlab_main diff --git a/db/docs/merge_requests_approval_rules_users.yml b/db/docs/merge_requests_approval_rules_users.yml new file mode 100644 index 00000000000000..59733175314a65 --- /dev/null +++ b/db/docs/merge_requests_approval_rules_users.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_users +classes: + - MergeRequests::ApprovalRulesUser + - MergeRequestsApprovalRulesUser +feature_categories: + - todo +description: TODO +introduced_by_url: TODO +milestone: '17.7' +gitlab_schema: gitlab_main diff --git a/db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb b/db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb deleted file mode 100644 index b537b8b2aaaa28..00000000000000 --- a/db/migrate/20241030105510_create_fk_for_merge_requests_approval_project_rules.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -# See https://docs.gitlab.com/ee/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CreateFkForMergeRequestsApprovalProjectRules < Gitlab::Database::Migration[2.2] - APPROVAL_RULE_INDEX = 'index_approval_project_rules_on_approval_rule_id' - milestone '17.6' - disable_ddl_transaction! - - def up - add_concurrent_foreign_key( - :merge_requests_approval_project_rules, :projects, column: :project_id, on_delete: :cascade - ) - end - - def down - with_lock_retries do - remove_foreign_key :merge_requests_approval_project_rules, column: :project_id - end - end -end diff --git a/db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb b/db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb deleted file mode 100644 index b645bf3d3e71b7..00000000000000 --- a/db/migrate/20241030162939_create_fk_for_merge_requests_approval_merge_request_rules.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -# See https://docs.gitlab.com/ee/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - -class CreateFkForMergeRequestsApprovalMergeRequestRules < Gitlab::Database::Migration[2.2] - disable_ddl_transaction! - milestone '17.6' - - def up - add_concurrent_foreign_key( - :merge_requests_approval_merge_request_rules, :merge_requests, column: :merge_request_id, on_delete: :cascade - ) - end - - def down - with_lock_retries do - remove_foreign_key :merge_requests_approval_merge_request_rules, column: :merge_request_id - end - end -end diff --git a/db/migrate/20241030105355_create_merge_requests_approval_rules.rb b/db/migrate/20241128131702_create_merge_requests_approval_rules.rb similarity index 85% rename from db/migrate/20241030105355_create_merge_requests_approval_rules.rb rename to db/migrate/20241128131702_create_merge_requests_approval_rules.rb index e7d7df9fc15b3a..b728a652c9e222 100644 --- a/db/migrate/20241030105355_create_merge_requests_approval_rules.rb +++ b/db/migrate/20241128131702_create_merge_requests_approval_rules.rb @@ -6,7 +6,7 @@ class CreateMergeRequestsApprovalRules < Gitlab::Database::Migration[2.2] milestone '17.6' def change - create_table :merge_requests_approval_rules do |t| + create_table :merge_requests_approval_rules do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason t.integer :approvals_required, null: false, default: 0 t.text :name, limit: 255, null: false t.integer :rule_type, null: false, default: 0 diff --git a/db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb b/db/migrate/20241128131722_create_merge_requests_approval_rules_projects.rb similarity index 58% rename from db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb rename to db/migrate/20241128131722_create_merge_requests_approval_rules_projects.rb index da390986676968..54f4de1c02e3db 100644 --- a/db/migrate/20241030105509_create_merge_requests_approval_project_rules.rb +++ b/db/migrate/20241128131722_create_merge_requests_approval_rules_projects.rb @@ -3,15 +3,15 @@ # See https://docs.gitlab.com/ee/development/migration_style_guide.html # for more information on how to write migrations for GitLab. -class CreateMergeRequestsApprovalProjectRules < Gitlab::Database::Migration[2.2] - milestone '17.6' +class CreateMergeRequestsApprovalRulesProjects < Gitlab::Database::Migration[2.2] + milestone '17.7' def change - create_table :merge_requests_approval_project_rules do |t| + create_table :merge_requests_approval_rules_projects do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason t.belongs_to( :approval_rule, foreign_key: { to_table: :merge_requests_approval_rules }, - index: { name: 'index_approval_project_rules_on_approval_rule_id' } + index: { name: 'index_approval_rules_project_on_approval_rule_id' } ) t.belongs_to :project, foreign_key: false diff --git a/db/migrate/20241128131741_create_fk_for_merge_requests_approval_rules_projects.rb b/db/migrate/20241128131741_create_fk_for_merge_requests_approval_rules_projects.rb new file mode 100644 index 00000000000000..38cf2bc0c5f964 --- /dev/null +++ b/db/migrate/20241128131741_create_fk_for_merge_requests_approval_rules_projects.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateFkForMergeRequestsApprovalRulesProjects < Gitlab::Database::Migration[2.2] + APPROVAL_RULE_INDEX = 'index_approval_rules_projects_on_approval_rule_id' + milestone '17.7' + disable_ddl_transaction! + + def up + add_concurrent_foreign_key( + :merge_requests_approval_rules_projects, :projects, column: :project_id, on_delete: :cascade + ) + end + + def down + with_lock_retries do + remove_foreign_key :merge_requests_approval_rules_projects, column: :project_id + end + end +end diff --git a/db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb b/db/migrate/20241128131801_create_merge_requests_approval_rules_groups.rb similarity index 57% rename from db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb rename to db/migrate/20241128131801_create_merge_requests_approval_rules_groups.rb index 2fbf2fd05830e3..b123551e1cb461 100644 --- a/db/migrate/20241030105539_create_merge_requests_approval_group_rules.rb +++ b/db/migrate/20241128131801_create_merge_requests_approval_rules_groups.rb @@ -3,15 +3,15 @@ # See https://docs.gitlab.com/ee/development/migration_style_guide.html # for more information on how to write migrations for GitLab. -class CreateMergeRequestsApprovalGroupRules < Gitlab::Database::Migration[2.2] - milestone '17.6' +class CreateMergeRequestsApprovalRulesGroups < Gitlab::Database::Migration[2.2] + milestone '17.7' def change - create_table :merge_requests_approval_group_rules do |t| + create_table :merge_requests_approval_rules_groups do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason t.belongs_to( :approval_rule, foreign_key: { to_table: :merge_requests_approval_rules }, - index: { name: 'index_approval_group_rules_on_approval_rule_id' } + index: { name: 'index_approval_rules_groups_on_approval_rule_id' } ) t.belongs_to :group, foreign_key: false diff --git a/db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb b/db/migrate/20241128131821_create_fk_for_merge_requests_approval_rules_groups.rb similarity index 51% rename from db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb rename to db/migrate/20241128131821_create_fk_for_merge_requests_approval_rules_groups.rb index 5a46dd624a14cd..c65b967193f3a8 100644 --- a/db/migrate/20241030105540_create_fk_for_merge_requests_approval_group_rules.rb +++ b/db/migrate/20241128131821_create_fk_for_merge_requests_approval_rules_groups.rb @@ -3,19 +3,19 @@ # See https://docs.gitlab.com/ee/development/migration_style_guide.html # for more information on how to write migrations for GitLab. -class CreateFkForMergeRequestsApprovalGroupRules < Gitlab::Database::Migration[2.2] +class CreateFkForMergeRequestsApprovalRulesGroups < Gitlab::Database::Migration[2.2] disable_ddl_transaction! - milestone '17.6' + milestone '17.7' def up add_concurrent_foreign_key( - :merge_requests_approval_group_rules, :namespaces, column: :group_id, on_delete: :cascade + :merge_requests_approval_rules_groups, :namespaces, column: :group_id, on_delete: :cascade ) end def down with_lock_retries do - remove_foreign_key :merge_requests_approval_group_rules, column: :group_id + remove_foreign_key :merge_requests_approval_rules_groups, column: :group_id end end end diff --git a/db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb b/db/migrate/20241128131843_create_merge_requests_approval_rules_merge_requests.rb similarity index 52% rename from db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb rename to db/migrate/20241128131843_create_merge_requests_approval_rules_merge_requests.rb index bd7f638b0c7484..2dc88fabef49b3 100644 --- a/db/migrate/20241030105638_create_merge_requests_approval_merge_request_rules.rb +++ b/db/migrate/20241128131843_create_merge_requests_approval_rules_merge_requests.rb @@ -3,21 +3,21 @@ # See https://docs.gitlab.com/ee/development/migration_style_guide.html # for more information on how to write migrations for GitLab. -class CreateMergeRequestsApprovalMergeRequestRules < Gitlab::Database::Migration[2.2] - milestone '17.6' +class CreateMergeRequestsApprovalRulesMergeRequests < Gitlab::Database::Migration[2.2] + milestone '17.7' def change - create_table :merge_requests_approval_merge_request_rules do |t| + create_table :merge_requests_approval_rules_merge_requests do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason t.belongs_to( :approval_rule, foreign_key: { to_table: :merge_requests_approval_rules }, - index: { name: 'index_approval_merge_request_rules_on_approval_rule_id' } + index: { name: 'index_approval_rules_merge_requests_on_approval_rule_id' } ) t.belongs_to( :merge_request, foreign_key: false, - index: { name: 'index_approval_merge_request_rules_on_merge_request_id' } + index: { name: 'index_approval_rules_merge_requests_on_merge_request_id' } ) t.timestamps_with_timezone null: false diff --git a/db/migrate/20241128131904_create_fk_for_merge_requests_approval_rules_merge_requests.rb b/db/migrate/20241128131904_create_fk_for_merge_requests_approval_rules_merge_requests.rb new file mode 100644 index 00000000000000..74d6f26cc80e9f --- /dev/null +++ b/db/migrate/20241128131904_create_fk_for_merge_requests_approval_rules_merge_requests.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateFkForMergeRequestsApprovalRulesMergeRequests < Gitlab::Database::Migration[2.2] + disable_ddl_transaction! + milestone '17.7' + + def up + add_concurrent_foreign_key( + :merge_requests_approval_rules_merge_requests, :merge_requests, column: :merge_request_id, on_delete: :cascade + ) + end + + def down + with_lock_retries do + remove_foreign_key :merge_requests_approval_rules_merge_requests, column: :merge_request_id + end + end +end diff --git a/db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb b/db/migrate/20241128131924_store_origin_in_merge_requests_approval_rules.rb similarity index 95% rename from db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb rename to db/migrate/20241128131924_store_origin_in_merge_requests_approval_rules.rb index f8e711861b5c50..4103c5eac13f66 100644 --- a/db/migrate/20241030183831_store_origin_in_merge_requests_approval_rules.rb +++ b/db/migrate/20241128131924_store_origin_in_merge_requests_approval_rules.rb @@ -4,7 +4,7 @@ # for more information on how to write migrations for GitLab. class StoreOriginInMergeRequestsApprovalRules < Gitlab::Database::Migration[2.2] - milestone '17.6' + milestone '17.7' def change add_column :merge_requests_approval_rules, :origin, :smallint, default: 0, null: false diff --git a/db/migrate/20241030190516_add_references_to_approval_rules.rb b/db/migrate/20241128131943_add_references_to_approval_rules.rb similarity index 97% rename from db/migrate/20241030190516_add_references_to_approval_rules.rb rename to db/migrate/20241128131943_add_references_to_approval_rules.rb index 944c9186737811..09076c5524be7d 100644 --- a/db/migrate/20241030190516_add_references_to_approval_rules.rb +++ b/db/migrate/20241128131943_add_references_to_approval_rules.rb @@ -4,7 +4,7 @@ # for more information on how to write migrations for GitLab. class AddReferencesToApprovalRules < Gitlab::Database::Migration[2.2] - milestone '17.6' + milestone '17.7' def change add_belongs_to( diff --git a/db/migrate/20241031120607_remove_approval_rule_references.rb b/db/migrate/20241128132004_remove_approval_rule_references.rb similarity index 97% rename from db/migrate/20241031120607_remove_approval_rule_references.rb rename to db/migrate/20241128132004_remove_approval_rule_references.rb index 1545315fff2835..6d29d8c9b4131a 100644 --- a/db/migrate/20241031120607_remove_approval_rule_references.rb +++ b/db/migrate/20241128132004_remove_approval_rule_references.rb @@ -4,7 +4,7 @@ # for more information on how to write migrations for GitLab. class RemoveApprovalRuleReferences < Gitlab::Database::Migration[2.2] - milestone '17.6' + milestone '17.7' def change remove_belongs_to( diff --git a/db/migrate/20241128132024_create_merge_requests_approval_rules_users.rb b/db/migrate/20241128132024_create_merge_requests_approval_rules_users.rb new file mode 100644 index 00000000000000..1fd52de3b0b71e --- /dev/null +++ b/db/migrate/20241128132024_create_merge_requests_approval_rules_users.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalRulesUsers < Gitlab::Database::Migration[2.2] + milestone '17.7' + + def change + create_table :merge_requests_approval_rules_users do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_rules_users_on_approval_rule_id' } + ) + t.belongs_to :user, foreign_key: false + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241128132045_create_merge_requests_approval_rules_user_groups.rb b/db/migrate/20241128132045_create_merge_requests_approval_rules_user_groups.rb new file mode 100644 index 00000000000000..aa179bb349f186 --- /dev/null +++ b/db/migrate/20241128132045_create_merge_requests_approval_rules_user_groups.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalRulesUserGroups < Gitlab::Database::Migration[2.2] + milestone '17.7' + + def change + create_table :merge_requests_approval_rules_user_groups do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_rules_user_groups_on_approval_rule_id' } + ) + t.belongs_to :group, foreign_key: false + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241128141642_create_merge_requests_approval_rules_protected_branches.rb b/db/migrate/20241128141642_create_merge_requests_approval_rules_protected_branches.rb new file mode 100644 index 00000000000000..beebcadb2e34fc --- /dev/null +++ b/db/migrate/20241128141642_create_merge_requests_approval_rules_protected_branches.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalRulesProtectedBranches < Gitlab::Database::Migration[2.2] + milestone '17.7' + + def change + create_table :merge_requests_approval_rules_protected_branches do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_rules_pb_on_approval_rule_id' } + ) + t.belongs_to( + :protected_branch, + foreign_key: false, + index: { name: 'index_approval_rules_on_approval_rule_pb_id' } + ) + + t.timestamps_with_timezone null: false + end + end +end diff --git a/db/migrate/20241128141707_create_merge_requests_approval_rules_security_policies.rb b/db/migrate/20241128141707_create_merge_requests_approval_rules_security_policies.rb new file mode 100644 index 00000000000000..fffe0e2bb4c3a7 --- /dev/null +++ b/db/migrate/20241128141707_create_merge_requests_approval_rules_security_policies.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class CreateMergeRequestsApprovalRulesSecurityPolicies < Gitlab::Database::Migration[2.2] + milestone '17.7' + + create_table :merge_requests_approval_rules_security_policy_links do |t| # rubocop:disable Migration/EnsureFactoryForTable -- Some Reason + t.belongs_to( + :approval_rule, + foreign_key: { to_table: :merge_requests_approval_rules }, + index: { name: 'index_approval_rules_sp_on_approval_rule_id' } + ) + t.belongs_to( + :security_policy, + foreign_key: false, + index: { name: 'index_approval_rules_on_approval_rule_sp_id' } + ) + + t.timestamps_with_timezone null: false + end +end diff --git a/db/schema_migrations/20241030105355 b/db/schema_migrations/20241030105355 deleted file mode 100644 index d8b66cadd38d5a..00000000000000 --- a/db/schema_migrations/20241030105355 +++ /dev/null @@ -1 +0,0 @@ -4e6a37ebc676bdf5c19ba2eb67a5a6f532d223ae8d73394a129c9a25550e6a0f \ No newline at end of file diff --git a/db/schema_migrations/20241030105509 b/db/schema_migrations/20241030105509 deleted file mode 100644 index 18f03d5c23d218..00000000000000 --- a/db/schema_migrations/20241030105509 +++ /dev/null @@ -1 +0,0 @@ -1bb00e9189f920df023d316d842bbabb8532b1a04e70576d3bfb5df86bbc5410 \ No newline at end of file diff --git a/db/schema_migrations/20241030105510 b/db/schema_migrations/20241030105510 deleted file mode 100644 index 1191c241fcc58a..00000000000000 --- a/db/schema_migrations/20241030105510 +++ /dev/null @@ -1 +0,0 @@ -599473af1b3ce8be1cbc9a5ed9c8554c9346f67d7acb90fb3333f59f63b99f28 \ No newline at end of file diff --git a/db/schema_migrations/20241030105539 b/db/schema_migrations/20241030105539 deleted file mode 100644 index 39f8a15c418489..00000000000000 --- a/db/schema_migrations/20241030105539 +++ /dev/null @@ -1 +0,0 @@ -c053f0153fcd75812f63c5d25974afcfda985914616b107183ce54801ad4df17 \ No newline at end of file diff --git a/db/schema_migrations/20241030105540 b/db/schema_migrations/20241030105540 deleted file mode 100644 index bf33c743e102eb..00000000000000 --- a/db/schema_migrations/20241030105540 +++ /dev/null @@ -1 +0,0 @@ -330177b3b3ff622f469b9c841a0a2c3a168bb91eff3f54a74497dbf1c036166e \ No newline at end of file diff --git a/db/schema_migrations/20241030105638 b/db/schema_migrations/20241030105638 deleted file mode 100644 index a3554954018e5f..00000000000000 --- a/db/schema_migrations/20241030105638 +++ /dev/null @@ -1 +0,0 @@ -8b93f9e57d4ef0b3b449d083d4c842a007a3b5511d9bbdb69e2d71fbc472cc84 \ No newline at end of file diff --git a/db/schema_migrations/20241030162939 b/db/schema_migrations/20241030162939 deleted file mode 100644 index 021f822769be52..00000000000000 --- a/db/schema_migrations/20241030162939 +++ /dev/null @@ -1 +0,0 @@ -7d9df6fbb0f9e260fc70b811d3796814348b9d634cbd7b7c851542fc49b1c3be \ No newline at end of file diff --git a/db/schema_migrations/20241030183831 b/db/schema_migrations/20241030183831 deleted file mode 100644 index 4c0cba6b199b8b..00000000000000 --- a/db/schema_migrations/20241030183831 +++ /dev/null @@ -1 +0,0 @@ -d0ae916dcfa6d419fbf6d6c0771740160f2f01c583d1e3c7506eeffe45a49aca \ No newline at end of file diff --git a/db/schema_migrations/20241030190516 b/db/schema_migrations/20241030190516 deleted file mode 100644 index 80bbf500e5bc3d..00000000000000 --- a/db/schema_migrations/20241030190516 +++ /dev/null @@ -1 +0,0 @@ -00f8efddb6107e7ead8c33040f7a4b6fdc5c7be5e6ae6029a317fbad8663238a \ No newline at end of file diff --git a/db/schema_migrations/20241031120607 b/db/schema_migrations/20241031120607 deleted file mode 100644 index b9ca662cc3eceb..00000000000000 --- a/db/schema_migrations/20241031120607 +++ /dev/null @@ -1 +0,0 @@ -e4e7ae7833eee201f96b148632899315d91c905904b695aec2a0ce58587b0b84 \ No newline at end of file diff --git a/db/schema_migrations/20241128131702 b/db/schema_migrations/20241128131702 new file mode 100644 index 00000000000000..f0f7482eb2b491 --- /dev/null +++ b/db/schema_migrations/20241128131702 @@ -0,0 +1 @@ +5bf20c59d5f1c53668aef83c9a7316f2b01ce348265f5bc2f0708dada4198033 \ No newline at end of file diff --git a/db/schema_migrations/20241128131722 b/db/schema_migrations/20241128131722 new file mode 100644 index 00000000000000..206f5db868fa30 --- /dev/null +++ b/db/schema_migrations/20241128131722 @@ -0,0 +1 @@ +d4d61e5fe21219f713910d477afa1d0c9da3593cddef1ca32af0ba257272fa0d \ No newline at end of file diff --git a/db/schema_migrations/20241128131741 b/db/schema_migrations/20241128131741 new file mode 100644 index 00000000000000..864a9fdb99b45e --- /dev/null +++ b/db/schema_migrations/20241128131741 @@ -0,0 +1 @@ +85db4facfc4292331751b24478da8ec3790b629e42defdcafad9770f644502be \ No newline at end of file diff --git a/db/schema_migrations/20241128131801 b/db/schema_migrations/20241128131801 new file mode 100644 index 00000000000000..f44bc2b73223ee --- /dev/null +++ b/db/schema_migrations/20241128131801 @@ -0,0 +1 @@ +53218913d999412e813dbc4a68a0d323b55f4524a232c4d8bca2f0655f20c6d2 \ No newline at end of file diff --git a/db/schema_migrations/20241128131821 b/db/schema_migrations/20241128131821 new file mode 100644 index 00000000000000..e202448a9d8009 --- /dev/null +++ b/db/schema_migrations/20241128131821 @@ -0,0 +1 @@ +c34e8da9306d8cf9a1e241d4077d6641448c1dc1ff193e37257657d977ac6243 \ No newline at end of file diff --git a/db/schema_migrations/20241128131843 b/db/schema_migrations/20241128131843 new file mode 100644 index 00000000000000..06fae1e9217e0d --- /dev/null +++ b/db/schema_migrations/20241128131843 @@ -0,0 +1 @@ +abed9f8546d49123b224154b3fa3887afa5886f504bba4d14e954fb653ec5094 \ No newline at end of file diff --git a/db/schema_migrations/20241128131904 b/db/schema_migrations/20241128131904 new file mode 100644 index 00000000000000..0f3e043e30855f --- /dev/null +++ b/db/schema_migrations/20241128131904 @@ -0,0 +1 @@ +b1014cfca719adc6f234099ef9fd671150bc444d13d922af4403353433281460 \ No newline at end of file diff --git a/db/schema_migrations/20241128131924 b/db/schema_migrations/20241128131924 new file mode 100644 index 00000000000000..b40eb9f607ae65 --- /dev/null +++ b/db/schema_migrations/20241128131924 @@ -0,0 +1 @@ +55a6b9d2c4234c1420388f1782e36050127d4ec61683230a179b9e890929ecee \ No newline at end of file diff --git a/db/schema_migrations/20241128131943 b/db/schema_migrations/20241128131943 new file mode 100644 index 00000000000000..cd003d1613e8b0 --- /dev/null +++ b/db/schema_migrations/20241128131943 @@ -0,0 +1 @@ +3848c8a7189445e9e8f7cb3be2f144c719974469cb80a05d29841a48ef40e25c \ No newline at end of file diff --git a/db/schema_migrations/20241128132004 b/db/schema_migrations/20241128132004 new file mode 100644 index 00000000000000..2c2b6e0c7801aa --- /dev/null +++ b/db/schema_migrations/20241128132004 @@ -0,0 +1 @@ +b6fc8a83d0b6f30e90fc0a6b5c056e201a07f21dc712861381d70a6714ac14b2 \ No newline at end of file diff --git a/db/schema_migrations/20241128132024 b/db/schema_migrations/20241128132024 new file mode 100644 index 00000000000000..c67e4a92be4f9f --- /dev/null +++ b/db/schema_migrations/20241128132024 @@ -0,0 +1 @@ +878029555f742c1a5e54c8b692d1f27f93855a9d70639a27c88e0c919bd16e4a \ No newline at end of file diff --git a/db/schema_migrations/20241128132045 b/db/schema_migrations/20241128132045 new file mode 100644 index 00000000000000..95d8707b6410e3 --- /dev/null +++ b/db/schema_migrations/20241128132045 @@ -0,0 +1 @@ +643812b07308883cff81a998c6a894bbaf42000df475f4d58330e1caf589cff5 \ No newline at end of file diff --git a/db/schema_migrations/20241128141642 b/db/schema_migrations/20241128141642 new file mode 100644 index 00000000000000..83f625104d9631 --- /dev/null +++ b/db/schema_migrations/20241128141642 @@ -0,0 +1 @@ +2388d5e23cfc632a2c331e53045c232066ffb799a8388bf1f4e8f1bc1a94ddd6 \ No newline at end of file diff --git a/db/schema_migrations/20241128141707 b/db/schema_migrations/20241128141707 new file mode 100644 index 00000000000000..a11027c27740a2 --- /dev/null +++ b/db/schema_migrations/20241128141707 @@ -0,0 +1 @@ +97ac1201da43d9b7d43c782fd237178254d5f5ef343426bca7a5ea8b2fa056a5 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index dacc2325b22d7b..bd936e5fa3f394 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -14625,7 +14625,19 @@ CREATE TABLE merge_requests ( CONSTRAINT check_970d272570 CHECK ((lock_version IS NOT NULL)) ); -CREATE TABLE merge_requests_approval_group_rules ( +CREATE TABLE merge_requests_approval_rules ( + id bigint NOT NULL, + approvals_required integer DEFAULT 0 NOT NULL, + name text NOT NULL, + rule_type integer DEFAULT 0 NOT NULL, + source_rule_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL, + origin smallint DEFAULT 0 NOT NULL, + CONSTRAINT check_c7c36145b7 CHECK ((char_length(name) <= 255)) +); + +CREATE TABLE merge_requests_approval_rules_groups ( id bigint NOT NULL, approval_rule_id bigint, group_id bigint, @@ -14633,16 +14645,25 @@ CREATE TABLE merge_requests_approval_group_rules ( updated_at timestamp with time zone NOT NULL ); -CREATE SEQUENCE merge_requests_approval_group_rules_id_seq +CREATE SEQUENCE merge_requests_approval_rules_groups_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; -ALTER SEQUENCE merge_requests_approval_group_rules_id_seq OWNED BY merge_requests_approval_group_rules.id; +ALTER SEQUENCE merge_requests_approval_rules_groups_id_seq OWNED BY merge_requests_approval_rules_groups.id; -CREATE TABLE merge_requests_approval_merge_request_rules ( +CREATE SEQUENCE merge_requests_approval_rules_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_rules_id_seq OWNED BY merge_requests_approval_rules.id; + +CREATE TABLE merge_requests_approval_rules_merge_requests ( id bigint NOT NULL, approval_rule_id bigint, merge_request_id bigint, @@ -14650,16 +14671,16 @@ CREATE TABLE merge_requests_approval_merge_request_rules ( updated_at timestamp with time zone NOT NULL ); -CREATE SEQUENCE merge_requests_approval_merge_request_rules_id_seq +CREATE SEQUENCE merge_requests_approval_rules_merge_requests_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; -ALTER SEQUENCE merge_requests_approval_merge_request_rules_id_seq OWNED BY merge_requests_approval_merge_request_rules.id; +ALTER SEQUENCE merge_requests_approval_rules_merge_requests_id_seq OWNED BY merge_requests_approval_rules_merge_requests.id; -CREATE TABLE merge_requests_approval_project_rules ( +CREATE TABLE merge_requests_approval_rules_projects ( id bigint NOT NULL, approval_rule_id bigint, project_id bigint, @@ -14667,35 +14688,82 @@ CREATE TABLE merge_requests_approval_project_rules ( updated_at timestamp with time zone NOT NULL ); -CREATE SEQUENCE merge_requests_approval_project_rules_id_seq +CREATE SEQUENCE merge_requests_approval_rules_projects_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; -ALTER SEQUENCE merge_requests_approval_project_rules_id_seq OWNED BY merge_requests_approval_project_rules.id; +ALTER SEQUENCE merge_requests_approval_rules_projects_id_seq OWNED BY merge_requests_approval_rules_projects.id; -CREATE TABLE merge_requests_approval_rules ( +CREATE TABLE merge_requests_approval_rules_protected_branches ( id bigint NOT NULL, - approvals_required integer DEFAULT 0 NOT NULL, - name text NOT NULL, - rule_type integer DEFAULT 0 NOT NULL, - source_rule_id bigint, + approval_rule_id bigint, + protected_branch_id bigint, created_at timestamp with time zone NOT NULL, - updated_at timestamp with time zone NOT NULL, - origin smallint DEFAULT 0 NOT NULL, - CONSTRAINT check_c7c36145b7 CHECK ((char_length(name) <= 255)) + updated_at timestamp with time zone NOT NULL ); -CREATE SEQUENCE merge_requests_approval_rules_id_seq +CREATE SEQUENCE merge_requests_approval_rules_protected_branches_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; -ALTER SEQUENCE merge_requests_approval_rules_id_seq OWNED BY merge_requests_approval_rules.id; +ALTER SEQUENCE merge_requests_approval_rules_protected_branches_id_seq OWNED BY merge_requests_approval_rules_protected_branches.id; + +CREATE TABLE merge_requests_approval_rules_security_policy_links ( + id bigint NOT NULL, + approval_rule_id bigint, + security_policy_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +CREATE SEQUENCE merge_requests_approval_rules_security_policy_links_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_rules_security_policy_links_id_seq OWNED BY merge_requests_approval_rules_security_policy_links.id; + +CREATE TABLE merge_requests_approval_rules_user_groups ( + id bigint NOT NULL, + approval_rule_id bigint, + group_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +CREATE SEQUENCE merge_requests_approval_rules_user_groups_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_rules_user_groups_id_seq OWNED BY merge_requests_approval_rules_user_groups.id; + +CREATE TABLE merge_requests_approval_rules_users ( + id bigint NOT NULL, + approval_rule_id bigint, + user_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +CREATE SEQUENCE merge_requests_approval_rules_users_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_rules_users_id_seq OWNED BY merge_requests_approval_rules_users.id; CREATE TABLE merge_requests_closing_issues ( id bigint NOT NULL, @@ -23589,13 +23657,21 @@ ALTER TABLE ONLY merge_request_user_mentions ALTER COLUMN id SET DEFAULT nextval ALTER TABLE ONLY merge_requests ALTER COLUMN id SET DEFAULT nextval('merge_requests_id_seq'::regclass); -ALTER TABLE ONLY merge_requests_approval_group_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_group_rules_id_seq'::regclass); +ALTER TABLE ONLY merge_requests_approval_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_id_seq'::regclass); -ALTER TABLE ONLY merge_requests_approval_merge_request_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_merge_request_rules_id_seq'::regclass); +ALTER TABLE ONLY merge_requests_approval_rules_groups ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_groups_id_seq'::regclass); -ALTER TABLE ONLY merge_requests_approval_project_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_project_rules_id_seq'::regclass); +ALTER TABLE ONLY merge_requests_approval_rules_merge_requests ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_merge_requests_id_seq'::regclass); -ALTER TABLE ONLY merge_requests_approval_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_id_seq'::regclass); +ALTER TABLE ONLY merge_requests_approval_rules_projects ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_projects_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_rules_protected_branches ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_protected_branches_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_rules_security_policy_links ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_security_policy_links_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_rules_user_groups ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_user_groups_id_seq'::regclass); + +ALTER TABLE ONLY merge_requests_approval_rules_users ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_rules_users_id_seq'::regclass); ALTER TABLE ONLY merge_requests_closing_issues ALTER COLUMN id SET DEFAULT nextval('merge_requests_closing_issues_id_seq'::regclass); @@ -25997,18 +26073,30 @@ ALTER TABLE ONLY merge_request_reviewers ALTER TABLE ONLY merge_request_user_mentions ADD CONSTRAINT merge_request_user_mentions_pkey PRIMARY KEY (id); -ALTER TABLE ONLY merge_requests_approval_group_rules - ADD CONSTRAINT merge_requests_approval_group_rules_pkey PRIMARY KEY (id); +ALTER TABLE ONLY merge_requests_approval_rules_groups + ADD CONSTRAINT merge_requests_approval_rules_groups_pkey PRIMARY KEY (id); -ALTER TABLE ONLY merge_requests_approval_merge_request_rules - ADD CONSTRAINT merge_requests_approval_merge_request_rules_pkey PRIMARY KEY (id); - -ALTER TABLE ONLY merge_requests_approval_project_rules - ADD CONSTRAINT merge_requests_approval_project_rules_pkey PRIMARY KEY (id); +ALTER TABLE ONLY merge_requests_approval_rules_merge_requests + ADD CONSTRAINT merge_requests_approval_rules_merge_requests_pkey PRIMARY KEY (id); ALTER TABLE ONLY merge_requests_approval_rules ADD CONSTRAINT merge_requests_approval_rules_pkey PRIMARY KEY (id); +ALTER TABLE ONLY merge_requests_approval_rules_projects + ADD CONSTRAINT merge_requests_approval_rules_projects_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_rules_protected_branches + ADD CONSTRAINT merge_requests_approval_rules_protected_branches_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_rules_security_policy_links + ADD CONSTRAINT merge_requests_approval_rules_security_policy_links_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_rules_user_groups + ADD CONSTRAINT merge_requests_approval_rules_user_groups_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY merge_requests_approval_rules_users + ADD CONSTRAINT merge_requests_approval_rules_users_pkey PRIMARY KEY (id); + ALTER TABLE ONLY merge_requests_closing_issues ADD CONSTRAINT merge_requests_closing_issues_pkey PRIMARY KEY (id); @@ -29049,8 +29137,6 @@ CREATE INDEX index_approval_group_rules_groups_on_group_id ON approval_group_rul CREATE INDEX index_approval_group_rules_on_approval_policy_rule_id ON approval_group_rules USING btree (approval_policy_rule_id); -CREATE INDEX index_approval_group_rules_on_approval_rule_id ON merge_requests_approval_group_rules USING btree (approval_rule_id); - CREATE INDEX index_approval_group_rules_on_scan_result_policy_id ON approval_group_rules USING btree (scan_result_policy_id); CREATE INDEX index_approval_group_rules_protected_branches_on_group_id ON approval_group_rules_protected_branches USING btree (group_id); @@ -29075,10 +29161,6 @@ CREATE INDEX index_approval_merge_request_rules_groups_2 ON approval_merge_reque CREATE INDEX index_approval_merge_request_rules_on_approval_policy_rule_id ON approval_merge_request_rules USING btree (approval_policy_rule_id); -CREATE INDEX index_approval_merge_request_rules_on_approval_rule_id ON merge_requests_approval_merge_request_rules USING btree (approval_rule_id); - -CREATE INDEX index_approval_merge_request_rules_on_merge_request_id ON merge_requests_approval_merge_request_rules USING btree (merge_request_id); - CREATE INDEX index_approval_merge_request_rules_on_project_id ON approval_merge_request_rules USING btree (project_id); CREATE UNIQUE INDEX index_approval_merge_request_rules_users_1 ON approval_merge_request_rules_users USING btree (approval_merge_request_rule_id, user_id); @@ -29101,8 +29183,6 @@ CREATE INDEX index_approval_project_rules_groups_2 ON approval_project_rules_gro CREATE INDEX index_approval_project_rules_on_approval_policy_rule_id ON approval_project_rules USING btree (approval_policy_rule_id); -CREATE INDEX index_approval_project_rules_on_approval_rule_id ON merge_requests_approval_project_rules USING btree (approval_rule_id); - CREATE INDEX index_approval_project_rules_on_id_with_regular_type ON approval_project_rules USING btree (id) WHERE (rule_type = 0); CREATE INDEX index_approval_project_rules_on_project_id_and_rule_type ON approval_project_rules USING btree (project_id, rule_type); @@ -29131,14 +29211,28 @@ CREATE INDEX index_approval_rule_on_protected_environment_id ON protected_enviro CREATE INDEX index_approval_rules_code_owners_rule_type ON approval_merge_request_rules USING btree (merge_request_id) WHERE (rule_type = 2); -CREATE INDEX index_approval_rules_on_group_id ON merge_requests_approval_rules USING btree (group_id); +CREATE INDEX index_approval_rules_groups_on_approval_rule_id ON merge_requests_approval_rules_groups USING btree (approval_rule_id); + +CREATE INDEX index_approval_rules_merge_requests_on_approval_rule_id ON merge_requests_approval_rules_merge_requests USING btree (approval_rule_id); -CREATE INDEX index_approval_rules_on_merge_request_id ON merge_requests_approval_rules USING btree (merge_request_id); +CREATE INDEX index_approval_rules_merge_requests_on_merge_request_id ON merge_requests_approval_rules_merge_requests USING btree (merge_request_id); -CREATE INDEX index_approval_rules_on_project_id ON merge_requests_approval_rules USING btree (project_id); +CREATE INDEX index_approval_rules_on_approval_rule_pb_id ON merge_requests_approval_rules_protected_branches USING btree (protected_branch_id); + +CREATE INDEX index_approval_rules_on_approval_rule_sp_id ON merge_requests_approval_rules_security_policy_links USING btree (security_policy_id); CREATE INDEX index_approval_rules_on_source_rule_id ON merge_requests_approval_rules USING btree (source_rule_id); +CREATE INDEX index_approval_rules_pb_on_approval_rule_id ON merge_requests_approval_rules_protected_branches USING btree (approval_rule_id); + +CREATE INDEX index_approval_rules_project_on_approval_rule_id ON merge_requests_approval_rules_projects USING btree (approval_rule_id); + +CREATE INDEX index_approval_rules_sp_on_approval_rule_id ON merge_requests_approval_rules_security_policy_links USING btree (approval_rule_id); + +CREATE INDEX index_approval_rules_user_groups_on_approval_rule_id ON merge_requests_approval_rules_user_groups USING btree (approval_rule_id); + +CREATE INDEX index_approval_rules_users_on_approval_rule_id ON merge_requests_approval_rules_users USING btree (approval_rule_id); + CREATE INDEX index_approvals_on_merge_request_id_and_created_at ON approvals USING btree (merge_request_id, created_at); CREATE UNIQUE INDEX index_approvals_on_user_id_and_merge_request_id ON approvals USING btree (user_id, merge_request_id); @@ -31037,9 +31131,13 @@ CREATE INDEX index_merge_request_reviewers_on_user_id ON merge_request_reviewers CREATE UNIQUE INDEX index_merge_request_user_mentions_on_note_id ON merge_request_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL); -CREATE INDEX index_merge_requests_approval_group_rules_on_group_id ON merge_requests_approval_group_rules USING btree (group_id); +CREATE INDEX index_merge_requests_approval_rules_groups_on_group_id ON merge_requests_approval_rules_groups USING btree (group_id); + +CREATE INDEX index_merge_requests_approval_rules_projects_on_project_id ON merge_requests_approval_rules_projects USING btree (project_id); + +CREATE INDEX index_merge_requests_approval_rules_user_groups_on_group_id ON merge_requests_approval_rules_user_groups USING btree (group_id); -CREATE INDEX index_merge_requests_approval_project_rules_on_project_id ON merge_requests_approval_project_rules USING btree (project_id); +CREATE INDEX index_merge_requests_approval_rules_users_on_user_id ON merge_requests_approval_rules_users USING btree (user_id); CREATE INDEX index_merge_requests_closing_issues_on_issue_id ON merge_requests_closing_issues USING btree (issue_id); @@ -35684,9 +35782,6 @@ ALTER TABLE ONLY approval_project_rules_users ALTER TABLE ONLY security_policy_project_links ADD CONSTRAINT fk_0eba4d5d71 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_merge_request_rules - ADD CONSTRAINT fk_0f06ebd650 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; - ALTER TABLE ONLY deployment_approvals ADD CONSTRAINT fk_0f58311058 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; @@ -35768,9 +35863,6 @@ ALTER TABLE ONLY project_statistics ALTER TABLE ONLY issues ADD CONSTRAINT fk_1adaba52b0 FOREIGN KEY (correct_work_item_type_id) REFERENCES work_item_types(correct_id); -ALTER TABLE ONLY merge_requests_approval_group_rules - ADD CONSTRAINT fk_1c1190a413 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; - ALTER TABLE ONLY approval_policy_rule_project_links ADD CONSTRAINT fk_1c78796d52 FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE; @@ -35867,9 +35959,6 @@ ALTER TABLE ONLY resource_link_events ALTER TABLE ONLY ml_candidates ADD CONSTRAINT fk_2a0421d824 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_project_rules - ADD CONSTRAINT fk_2a541f65d4 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; - ALTER TABLE ONLY approval_group_rules ADD CONSTRAINT fk_2a74c6e52d FOREIGN KEY (approval_policy_rule_id) REFERENCES approval_policy_rules(id) ON DELETE CASCADE; @@ -36131,6 +36220,9 @@ ALTER TABLE ONLY approval_merge_request_rules ALTER TABLE ONLY deploy_keys_projects ADD CONSTRAINT fk_58a901ca7e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_groups + ADD CONSTRAINT fk_59068f09e5 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; + ALTER TABLE ONLY oauth_access_grants ADD CONSTRAINT fk_59cdb2323c FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE; @@ -36287,6 +36379,9 @@ ALTER TABLE ONLY index_statuses ALTER TABLE ONLY abuse_report_notes ADD CONSTRAINT fk_74e1990397 FOREIGN KEY (abuse_report_id) REFERENCES abuse_reports(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_merge_requests + ADD CONSTRAINT fk_74e3466397 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; + ALTER TABLE ONLY software_license_policies ADD CONSTRAINT fk_74f6d8328a FOREIGN KEY (custom_software_license_id) REFERENCES custom_software_licenses(id) ON DELETE CASCADE; @@ -36662,6 +36757,9 @@ ALTER TABLE ONLY ml_experiments ALTER TABLE ONLY merge_request_metrics ADD CONSTRAINT fk_ae440388cc FOREIGN KEY (latest_closed_by_id) REFERENCES users(id) ON DELETE SET NULL; +ALTER TABLE ONLY merge_requests_approval_rules_projects + ADD CONSTRAINT fk_af4078336f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; + ALTER TABLE ONLY analytics_cycle_analytics_group_stages ADD CONSTRAINT fk_analytics_cycle_analytics_group_stages_group_value_stream_id FOREIGN KEY (group_value_stream_id) REFERENCES analytics_cycle_analytics_group_value_streams(id) ON DELETE CASCADE; @@ -37301,9 +37399,6 @@ ALTER TABLE ONLY automation_rules ALTER TABLE ONLY incident_management_oncall_participants ADD CONSTRAINT fk_rails_032b12996a FOREIGN KEY (oncall_rotation_id) REFERENCES incident_management_oncall_rotations(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_rules - ADD CONSTRAINT fk_rails_03983bf729 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; - ALTER TABLE ONLY events ADD CONSTRAINT fk_rails_0434b48643 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; @@ -37325,6 +37420,9 @@ ALTER TABLE ONLY security_policies ALTER TABLE ONLY subscription_user_add_on_assignment_versions ADD CONSTRAINT fk_rails_091e013a61 FOREIGN KEY (organization_id) REFERENCES organizations(id); +ALTER TABLE ONLY merge_requests_approval_rules_groups + ADD CONSTRAINT fk_rails_094b4086a3 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY trending_projects ADD CONSTRAINT fk_rails_09feecd872 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; @@ -37382,9 +37480,6 @@ ALTER TABLE ONLY issue_email_participants ALTER TABLE ONLY merge_request_context_commits ADD CONSTRAINT fk_rails_0fe0039f60 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_group_rules - ADD CONSTRAINT fk_rails_1050c8bc82 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); - ALTER TABLE ONLY audit_events_streaming_headers ADD CONSTRAINT fk_rails_109fcf96e2 FOREIGN KEY (external_audit_event_destination_id) REFERENCES audit_events_external_audit_event_destinations(id) ON DELETE CASCADE; @@ -37421,9 +37516,6 @@ ALTER TABLE ONLY diff_note_positions ALTER TABLE ONLY analytics_cycle_analytics_aggregations ADD CONSTRAINT fk_rails_13c8374c7a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_merge_request_rules - ADD CONSTRAINT fk_rails_13fbeb2152 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); - ALTER TABLE ONLY service_desk_custom_email_verifications ADD CONSTRAINT fk_rails_14dcaf4c92 FOREIGN KEY (triggerer_id) REFERENCES users(id) ON DELETE SET NULL; @@ -37505,6 +37597,9 @@ ALTER TABLE ONLY project_ci_feature_usages ALTER TABLE ONLY packages_tags ADD CONSTRAINT fk_rails_1dfc868911 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_security_policy_links + ADD CONSTRAINT fk_rails_1ea772f06d FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY boards_epic_board_positions ADD CONSTRAINT fk_rails_1ecfd9f2de FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE; @@ -37790,6 +37885,9 @@ ALTER TABLE ONLY merge_request_assignees ALTER TABLE ONLY packages_dependency_links ADD CONSTRAINT fk_rails_4437bf4070 FOREIGN KEY (dependency_id) REFERENCES packages_dependencies(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_projects + ADD CONSTRAINT fk_rails_451a9dfe93 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE p_ci_builds ADD CONSTRAINT fk_rails_4540ead625_p FOREIGN KEY (upstream_pipeline_partition_id, upstream_pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE; @@ -37808,9 +37906,6 @@ ALTER TABLE ONLY protected_environment_deploy_access_levels ALTER TABLE ONLY smartcard_identities ADD CONSTRAINT fk_rails_4689f889a9 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_project_rules - ADD CONSTRAINT fk_rails_46fc7ba87f FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); - ALTER TABLE ONLY user_custom_attributes ADD CONSTRAINT fk_rails_47b91868a8 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; @@ -37970,6 +38065,9 @@ ALTER TABLE ONLY ci_stages ALTER TABLE ONLY epic_issues ADD CONSTRAINT fk_rails_5d942936b4 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_merge_requests + ADD CONSTRAINT fk_rails_5ddc4a2f7b FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY packages_nuget_symbols ADD CONSTRAINT fk_rails_5df972da14 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE SET NULL; @@ -38015,6 +38113,9 @@ ALTER TABLE ONLY status_page_published_incidents ALTER TABLE ONLY group_ssh_certificates ADD CONSTRAINT fk_rails_61f9eafcdf FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_user_groups + ADD CONSTRAINT fk_rails_62b95a2502 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY container_repository_states ADD CONSTRAINT fk_rails_63436c99ce FOREIGN KEY (container_repository_id) REFERENCES container_repositories(id) ON DELETE CASCADE; @@ -38111,15 +38212,15 @@ ALTER TABLE ci_runner_taggings ALTER TABLE ONLY term_agreements ADD CONSTRAINT fk_rails_6ea6520e4a FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_rules - ADD CONSTRAINT fk_rails_6eaf7990e8 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; - ALTER TABLE ONLY project_compliance_framework_settings ADD CONSTRAINT fk_rails_6f5294f16c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; ALTER TABLE ONLY users_security_dashboard_projects ADD CONSTRAINT fk_rails_6f6cf8e66e FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_protected_branches + ADD CONSTRAINT fk_rails_6feb548ad1 FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY analytics_dashboards_pointers ADD CONSTRAINT fk_rails_7027b7eaa9 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE; @@ -38210,9 +38311,6 @@ ALTER TABLE ONLY operations_scopes ALTER TABLE ONLY milestone_releases ADD CONSTRAINT fk_rails_7ae0756a2d FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE CASCADE; -ALTER TABLE ONLY merge_requests_approval_rules - ADD CONSTRAINT fk_rails_7af76dbd21 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; - ALTER TABLE ONLY scan_execution_policy_rules ADD CONSTRAINT fk_rails_7be2571ecf FOREIGN KEY (security_policy_id) REFERENCES security_policies(id) ON DELETE CASCADE; @@ -38858,6 +38956,9 @@ ALTER TABLE ONLY subscriptions ALTER TABLE ONLY operations_strategies ADD CONSTRAINT fk_rails_d183b6e6dd FOREIGN KEY (feature_flag_id) REFERENCES operations_feature_flags(id) ON DELETE CASCADE; +ALTER TABLE ONLY merge_requests_approval_rules_users + ADD CONSTRAINT fk_rails_d1c23df23f FOREIGN KEY (approval_rule_id) REFERENCES merge_requests_approval_rules(id); + ALTER TABLE ONLY cluster_agent_tokens ADD CONSTRAINT fk_rails_d1d26abc25 FOREIGN KEY (agent_id) REFERENCES cluster_agents(id) ON DELETE CASCADE; diff --git a/ee/app/models/ee/group.rb b/ee/app/models/ee/group.rb index e7f92ebaf66d6e..49ac3ff5d7d7bb 100644 --- a/ee/app/models/ee/group.rb +++ b/ee/app/models/ee/group.rb @@ -30,7 +30,7 @@ module Group add_authentication_token_field :saml_discovery_token, unique: false, token_generator: -> { Devise.friendly_token(8) } # rubocop:disable Gitlab/TokenWithoutPrefix -- wontfix; not used for authentication - has_many :v2_approval_group_rules, class_name: 'MergeRequests::ApprovalGroupRule', inverse_of: :group + has_many :v2_approval_group_rules, class_name: 'MergeRequests::ApprovalRulesGroup', inverse_of: :group has_many :v2_approval_rules, through: :v2_approval_group_rules, class_name: 'MergeRequests::ApprovalRule', source: :approval_rule has_many :epics diff --git a/ee/app/models/ee/merge_request.rb b/ee/app/models/ee/merge_request.rb index 87f5d5f7da1e82..334d8c93798559 100644 --- a/ee/app/models/ee/merge_request.rb +++ b/ee/app/models/ee/merge_request.rb @@ -27,10 +27,12 @@ module MergeRequest belongs_to :iteration, foreign_key: 'sprint_id', inverse_of: :merge_requests - has_many :v2_approval_merge_request_rules, class_name: 'MergeRequests::ApprovalMergeRequestRule', inverse_of: :merge_request - has_many :v2_approval_rules, through: :v2_approval_merge_request_rules, class_name: 'MergeRequests::ApprovalRule', source: :approval_rule + has_many :v2_approval_merge_request_rules, class_name: 'MergeRequests::ApprovalRulesMergeRequest', + inverse_of: :merge_request + has_many :v2_approval_rules, through: :v2_approval_merge_request_rules, + class_name: 'MergeRequests::ApprovalRule', source: :approval_rule - has_many :approvers, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent + has_many :approvers, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent -- Some reason has_many :approver_users, through: :approvers, source: :user has_many :approver_groups, as: :target, dependent: :delete_all has_many :status_check_responses, class_name: 'MergeRequests::StatusCheckResponse', inverse_of: :merge_request diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb index edc19ea950f49d..a3eee887844468 100644 --- a/ee/app/models/ee/project.rb +++ b/ee/app/models/ee/project.rb @@ -83,10 +83,10 @@ def preload_protected_branches has_many :zoekt_repositories, class_name: '::Search::Zoekt::Repository', inverse_of: :project has_one :secrets_manager, class_name: '::SecretsManagement::ProjectSecretsManager' - has_many :v2_approval_project_rules, class_name: 'MergeRequests::ApprovalProjectRule', inverse_of: :project + has_many :v2_approval_project_rules, class_name: 'MergeRequests::ApprovalRulesProject', inverse_of: :project has_many :v2_approval_rules, through: :v2_approval_project_rules, class_name: 'MergeRequests::ApprovalRule', source: :approval_rule - has_many :approvers, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent + has_many :approvers, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent -- Some reason has_many :approver_users, through: :approvers, source: :user has_many :approver_groups, as: :target, dependent: :destroy has_many :approval_rules, class_name: 'ApprovalProjectRule', extend: FilterByBranch diff --git a/ee/app/models/merge_requests/approval_merge_request_rule.rb b/ee/app/models/merge_requests/approval_merge_request_rule.rb deleted file mode 100644 index 1fd749c34f07bf..00000000000000 --- a/ee/app/models/merge_requests/approval_merge_request_rule.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module MergeRequests - class ApprovalMergeRequestRule < ApplicationRecord - self.table_name = 'merge_requests_approval_merge_request_rules' - belongs_to :merge_request - belongs_to :approval_rule - end -end diff --git a/ee/app/models/merge_requests/approval_rule.rb b/ee/app/models/merge_requests/approval_rule.rb index c78616a241f7f6..d094bd5c99623f 100644 --- a/ee/app/models/merge_requests/approval_rule.rb +++ b/ee/app/models/merge_requests/approval_rule.rb @@ -4,28 +4,28 @@ module MergeRequests class ApprovalRule < ApplicationRecord self.table_name = 'merge_requests_approval_rules' # When this originated_from_group there's only one group - has_one :approval_group_rule, inverse_of: :approval_rule - has_one :group, through: :approval_group_rule + has_one :approval_rules_group, inverse_of: :approval_rule + has_one :group, through: :approval_rules_group # If we allow overriding in subgroups we can add groups association # has_many :approval_group_rules # has_many :groups, through: :approval_group_rules # When this originated_from_project there's only one project - has_one :approval_project_rule, inverse_of: :approval_rule - has_one :project, through: :approval_project_rule + has_one :approval_rules_project, inverse_of: :approval_rule + has_one :project, through: :approval_rules_project # When this originated_from_group there are multiple projects - has_many :approval_project_rules - has_many :projects, through: :approval_project_rules + has_many :approval_rules_projects + has_many :projects, through: :approval_rules_projects # When this originated_from_merge_request there's only one merge_request - has_many :approval_merge_request_rule, inverse_of: :approval_rule - has_many :merge_request, through: :approval_merge_request_rule + has_one :approval_rules_merge_request, inverse_of: :approval_rule + has_one :merge_request, through: :approval_rules_merge_request # When this originated_from_project there are multiple merge_requests - has_many :approval_merge_request_rules - has_many :merge_requests, through: :approval_merge_request_rules + has_many :approval_rules_merge_requests + has_many :merge_requests, through: :approval_rules_merge_requests with_options validate: true do enum :rule_type, { regular: 0, code_owner: 1, report_approver: 2, any_approver: 3 }, default: :regular diff --git a/ee/app/models/merge_requests/approval_group_rule.rb b/ee/app/models/merge_requests/approval_rules_group.rb similarity index 51% rename from ee/app/models/merge_requests/approval_group_rule.rb rename to ee/app/models/merge_requests/approval_rules_group.rb index 9ca6783f1ee9ca..a5a9411a7ef5ea 100644 --- a/ee/app/models/merge_requests/approval_group_rule.rb +++ b/ee/app/models/merge_requests/approval_rules_group.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module MergeRequests - class ApprovalGroupRule < ApplicationRecord - self.table_name = 'merge_requests_approval_group_rules' + class ApprovalRulesGroup < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_groups' belongs_to :approval_rule belongs_to :group end diff --git a/ee/app/models/merge_requests/approval_rules_merge_request.rb b/ee/app/models/merge_requests/approval_rules_merge_request.rb new file mode 100644 index 00000000000000..0baeb149c3c3cf --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_merge_request.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesMergeRequest < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_merge_requests' + belongs_to :merge_request + belongs_to :approval_rule + end +end diff --git a/ee/app/models/merge_requests/approval_project_rule.rb b/ee/app/models/merge_requests/approval_rules_project.rb similarity index 50% rename from ee/app/models/merge_requests/approval_project_rule.rb rename to ee/app/models/merge_requests/approval_rules_project.rb index 5a1742762b32ae..a763f611864c73 100644 --- a/ee/app/models/merge_requests/approval_project_rule.rb +++ b/ee/app/models/merge_requests/approval_rules_project.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module MergeRequests - class ApprovalProjectRule < ApplicationRecord - self.table_name = 'merge_requests_approval_project_rules' + class ApprovalRulesProject < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_projects' belongs_to :approval_rule belongs_to :project end diff --git a/ee/app/models/merge_requests/approval_rules_protected_branch.rb b/ee/app/models/merge_requests/approval_rules_protected_branch.rb new file mode 100644 index 00000000000000..5d4bccf4b21ffd --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_protected_branch.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesProtectedBranch < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_protected_branches' + belongs_to :approval_rule + belongs_to :protected_branch + end +end diff --git a/ee/app/models/merge_requests/approval_rules_security_policy_link.rb b/ee/app/models/merge_requests/approval_rules_security_policy_link.rb new file mode 100644 index 00000000000000..a533de4663848d --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_security_policy_link.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesSecurityPolicyLink < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_security_policy_links' + belongs_to :approval_rule + belongs_to :security_policy + end +end diff --git a/ee/app/models/merge_requests/approval_rules_user.rb b/ee/app/models/merge_requests/approval_rules_user.rb new file mode 100644 index 00000000000000..bb9c4ae8af321d --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_user.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesUser < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_users' + belongs_to :approval_rule + belongs_to :user + end +end diff --git a/ee/app/models/merge_requests/approval_rules_user_group.rb b/ee/app/models/merge_requests/approval_rules_user_group.rb new file mode 100644 index 00000000000000..8957150e1bab9d --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_user_group.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesUserGroup < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_user_groups' + belongs_to :approval_rule + belongs_to :group + end +end diff --git a/ee/spec/factories/merge_requests/approval_merge_request_rules.rb b/ee/spec/factories/merge_requests/approval_merge_request_rules.rb deleted file mode 100644 index a2a055cf76ee89..00000000000000 --- a/ee/spec/factories/merge_requests/approval_merge_request_rules.rb +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true - -FactoryBot.define do - factory :merge_requests_approval_merge_request_rule, class: 'MergeRequests::ApprovalMergeRequestRule' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot - end -end diff --git a/ee/spec/factories/merge_requests/approval_project_rules.rb b/ee/spec/factories/merge_requests/approval_project_rules.rb deleted file mode 100644 index 76e1df667f0907..00000000000000 --- a/ee/spec/factories/merge_requests/approval_project_rules.rb +++ /dev/null @@ -1,6 +0,0 @@ -# frozen_string_literal: true - -FactoryBot.define do - factory :merge_requests_approval_project_rule, class: 'MergeRequests::ApprovalProjectRule' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot - end -end diff --git a/ee/spec/factories/merge_requests/approval_group_rules.rb b/ee/spec/factories/merge_requests/approval_rules_groups.rb similarity index 64% rename from ee/spec/factories/merge_requests/approval_group_rules.rb rename to ee/spec/factories/merge_requests/approval_rules_groups.rb index 2c02035010d914..fb8212dd5ea6cc 100644 --- a/ee/spec/factories/merge_requests/approval_group_rules.rb +++ b/ee/spec/factories/merge_requests/approval_rules_groups.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true FactoryBot.define do - factory :merge_requests_approval_group_rule, class: 'MergeRequests::ApprovalGroupRule' do + factory :merge_requests_approval_rules_group, class: 'MergeRequests::ApprovalRulesGroup' do association :approval_rule, factory: :merge_requests_approval_rule association :group, factory: :group end diff --git a/ee/spec/factories/merge_requests/approval_rules_merge_requests.rb b/ee/spec/factories/merge_requests/approval_rules_merge_requests.rb new file mode 100644 index 00000000000000..926ed80982ba3a --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_merge_requests.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_merge_request, class: 'MergeRequests::ApprovalRulesMergeRequest' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_rules_projects.rb b/ee/spec/factories/merge_requests/approval_rules_projects.rb new file mode 100644 index 00000000000000..73d07b0e9ade1f --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_projects.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_project, class: 'MergeRequests::ApprovalRulesProject' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_rules_protected_branches.rb b/ee/spec/factories/merge_requests/approval_rules_protected_branches.rb new file mode 100644 index 00000000000000..be050456f1e9e6 --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_protected_branches.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_protected_branch, class: 'MergeRequests::ApprovalRulesProtectedBranch' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_rules_security_policy_links.rb b/ee/spec/factories/merge_requests/approval_rules_security_policy_links.rb new file mode 100644 index 00000000000000..537ed9b86b0dab --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_security_policy_links.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_security_policy_link, class: 'MergeRequests::ApprovalRulesSecurityPolicyLink' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_rules_user_groups.rb b/ee/spec/factories/merge_requests/approval_rules_user_groups.rb new file mode 100644 index 00000000000000..599052024bf26e --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_user_groups.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_user_group, class: 'MergeRequests::ApprovalRulesUserGroup' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end diff --git a/ee/spec/factories/merge_requests/approval_rules_users.rb b/ee/spec/factories/merge_requests/approval_rules_users.rb new file mode 100644 index 00000000000000..79eca39a854deb --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_users.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_user, class: 'MergeRequests::ApprovalRulesUser' do # rubocop:disable Lint/EmptyBlock -- block is required by factorybot + end +end -- GitLab