diff --git a/db/docs/approval_group_rules.yml b/db/docs/approval_group_rules.yml index 3b5081c068bfbbc4d20fdcd4536515fc925d39e3..632a48c686045f6d813a03869d38c7c9149b94db 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 fdda6c8da1ef59a543b116f0a9f2ff40df93c61b..0a509d677a593be31253fdfeea009d61c63b2996 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 730c8b2c5c7ad7b325dd5914a487d16ad034110f..3a20c38431415b463e4b521e3ab2133d17af4891 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_rules.yml b/db/docs/merge_requests_approval_rules.yml new file mode 100644 index 0000000000000000000000000000000000000000..6b7f8133ba4e7616490dfb5bd4f91c121b6d3163 --- /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/docs/merge_requests_approval_rules_groups.yml b/db/docs/merge_requests_approval_rules_groups.yml new file mode 100644 index 0000000000000000000000000000000000000000..c4cd0f81f90f7c72a4abee4691775d017c41fced --- /dev/null +++ b/db/docs/merge_requests_approval_rules_groups.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_groups +classes: +- MergeRequests::ApprovalRulesGroup +- MergeRequestsApprovalRulesGroup +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_merge_requests.yml b/db/docs/merge_requests_approval_rules_merge_requests.yml new file mode 100644 index 0000000000000000000000000000000000000000..ade8609939d950f7f8718fe4de73968c4e90e8ce --- /dev/null +++ b/db/docs/merge_requests_approval_rules_merge_requests.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_merge_requests +classes: +- MergeRequests::ApprovalRulesMergeRequest +- 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_rules_projects.yml b/db/docs/merge_requests_approval_rules_projects.yml new file mode 100644 index 0000000000000000000000000000000000000000..5bf6062f898db6bce86e23927e75a65b3481a2ed --- /dev/null +++ b/db/docs/merge_requests_approval_rules_projects.yml @@ -0,0 +1,11 @@ +--- +table_name: merge_requests_approval_rules_projects +classes: +- MergeRequests::ApprovalRulesProject +- MergeRequestsApprovalRulesProject +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_protected_branches.yml b/db/docs/merge_requests_approval_rules_protected_branches.yml new file mode 100644 index 0000000000000000000000000000000000000000..4c1bb8ddc6729d050f248f9899b568e337016640 --- /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 0000000000000000000000000000000000000000..b6534246c55989e72b2b0d33710562cc0cf73145 --- /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 0000000000000000000000000000000000000000..dc4b36dea44bc11f0dc5ddeab74d42eb35f0bad7 --- /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 0000000000000000000000000000000000000000..59733175314a65b1332444a2cd5ccfc157ca978d --- /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/20241128131702_create_merge_requests_approval_rules.rb b/db/migrate/20241128131702_create_merge_requests_approval_rules.rb new file mode 100644 index 0000000000000000000000000000000000000000..b728a652c9e22208fc088cf1db945367b8a62529 --- /dev/null +++ b/db/migrate/20241128131702_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| # 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 + + 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/20241128131722_create_merge_requests_approval_rules_projects.rb b/db/migrate/20241128131722_create_merge_requests_approval_rules_projects.rb new file mode 100644 index 0000000000000000000000000000000000000000..54f4de1c02e3dbe0d7791ca9359970425376e168 --- /dev/null +++ b/db/migrate/20241128131722_create_merge_requests_approval_rules_projects.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 CreateMergeRequestsApprovalRulesProjects < Gitlab::Database::Migration[2.2] + milestone '17.7' + + def change + 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_rules_project_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/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 0000000000000000000000000000000000000000..38cf2bc0c5f964565b617a2885acfba72d9219e5 --- /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/20241128131801_create_merge_requests_approval_rules_groups.rb b/db/migrate/20241128131801_create_merge_requests_approval_rules_groups.rb new file mode 100644 index 0000000000000000000000000000000000000000..b123551e1cb461fac11698a53979f2c766cfa720 --- /dev/null +++ b/db/migrate/20241128131801_create_merge_requests_approval_rules_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 CreateMergeRequestsApprovalRulesGroups < Gitlab::Database::Migration[2.2] + milestone '17.7' + + def change + 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_rules_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/20241128131821_create_fk_for_merge_requests_approval_rules_groups.rb b/db/migrate/20241128131821_create_fk_for_merge_requests_approval_rules_groups.rb new file mode 100644 index 0000000000000000000000000000000000000000..c65b967193f3a81f9d9251d09cde44c92f8ff290 --- /dev/null +++ b/db/migrate/20241128131821_create_fk_for_merge_requests_approval_rules_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 CreateFkForMergeRequestsApprovalRulesGroups < Gitlab::Database::Migration[2.2] + disable_ddl_transaction! + milestone '17.7' + + def up + add_concurrent_foreign_key( + :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_rules_groups, column: :group_id + end + end +end diff --git a/db/migrate/20241128131843_create_merge_requests_approval_rules_merge_requests.rb b/db/migrate/20241128131843_create_merge_requests_approval_rules_merge_requests.rb new file mode 100644 index 0000000000000000000000000000000000000000..2dc88fabef49b30bb1e7f422aef16419d34c4bf2 --- /dev/null +++ b/db/migrate/20241128131843_create_merge_requests_approval_rules_merge_requests.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 CreateMergeRequestsApprovalRulesMergeRequests < Gitlab::Database::Migration[2.2] + milestone '17.7' + + def change + 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_rules_merge_requests_on_approval_rule_id' } + ) + + t.belongs_to( + :merge_request, + foreign_key: false, + index: { name: 'index_approval_rules_merge_requests_on_merge_request_id' } + ) + + t.timestamps_with_timezone null: false + end + end +end 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 0000000000000000000000000000000000000000..74d6f26cc80e9f264dafed2ea64d9fdfbe35ba33 --- /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/20241128131924_store_origin_in_merge_requests_approval_rules.rb b/db/migrate/20241128131924_store_origin_in_merge_requests_approval_rules.rb new file mode 100644 index 0000000000000000000000000000000000000000..4103c5eac13f66fa9bf09f4a99d5f142292f1013 --- /dev/null +++ b/db/migrate/20241128131924_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.7' + + def change + add_column :merge_requests_approval_rules, :origin, :smallint, default: 0, null: false + end +end diff --git a/db/migrate/20241128131943_add_references_to_approval_rules.rb b/db/migrate/20241128131943_add_references_to_approval_rules.rb new file mode 100644 index 0000000000000000000000000000000000000000..09076c5524be7db7dcf0dd2957bf1b380a27c624 --- /dev/null +++ b/db/migrate/20241128131943_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.7' + + 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/20241128132004_remove_approval_rule_references.rb b/db/migrate/20241128132004_remove_approval_rule_references.rb new file mode 100644 index 0000000000000000000000000000000000000000..6d29d8c9b4131ad2ebae8ea4e580515a8cd74b5a --- /dev/null +++ b/db/migrate/20241128132004_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.7' + + 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/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 0000000000000000000000000000000000000000..1fd52de3b0b71e3c9c5f3ad77dcdcca2e89d714c --- /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 0000000000000000000000000000000000000000..aa179bb349f186276a24e6773cffdf8b79d5e59c --- /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 0000000000000000000000000000000000000000..beebcadb2e34fc42b9d9701924a665cfeef9d4cf --- /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 0000000000000000000000000000000000000000..fffe0e2bb4c3a7dbfe0ffe8acb8aea93b98bd8d6 --- /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/20241128131702 b/db/schema_migrations/20241128131702 new file mode 100644 index 0000000000000000000000000000000000000000..f0f7482eb2b4913f40942a3bd9f1f09f1fdb95f2 --- /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 0000000000000000000000000000000000000000..206f5db868fa30dead82ce6594bfaeb0140bc3f4 --- /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 0000000000000000000000000000000000000000..864a9fdb99b45ec9f11aece8fb089be380ab5263 --- /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 0000000000000000000000000000000000000000..f44bc2b73223ee545bed314b256d5657d0b575cf --- /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 0000000000000000000000000000000000000000..e202448a9d80099a0d3acda26d92b5154d2825b4 --- /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 0000000000000000000000000000000000000000..06fae1e9217e0d3cbb561d9ab19f0e9232b94809 --- /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 0000000000000000000000000000000000000000..0f3e043e30855f79d95fb1cfc12cadca8ec83ce7 --- /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 0000000000000000000000000000000000000000..b40eb9f607ae65a28fb31e210bfe210113b3c0cb --- /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 0000000000000000000000000000000000000000..cd003d1613e8b06499cb2ec80bdcf1fa01b9e2f6 --- /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 0000000000000000000000000000000000000000..2c2b6e0c7801aa1362fb5f3f1a27efa649da17d1 --- /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 0000000000000000000000000000000000000000..c67e4a92be4f9f7a3cff4039d3614b03f2456f2f --- /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 0000000000000000000000000000000000000000..95d8707b6410e3150d9c9b81fc35e35a8e577950 --- /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 0000000000000000000000000000000000000000..83f625104d96317710345f9ed6ae54dbddcd4508 --- /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 0000000000000000000000000000000000000000..a11027c27740a231368b36913e107d1896c90d15 --- /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 156626122a3023215fe5edf7c592f5dda3a7e0c7..bd936e5fa3f394b6d4947c76e6864b2b9c72f1eb 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -14625,6 +14625,146 @@ CREATE TABLE merge_requests ( CONSTRAINT check_970d272570 CHECK ((lock_version IS NOT NULL)) ); +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, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +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_rules_groups_id_seq OWNED BY merge_requests_approval_rules_groups.id; + +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, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +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_rules_merge_requests_id_seq OWNED BY merge_requests_approval_rules_merge_requests.id; + +CREATE TABLE merge_requests_approval_rules_projects ( + 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_rules_projects_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE merge_requests_approval_rules_projects_id_seq OWNED BY merge_requests_approval_rules_projects.id; + +CREATE TABLE merge_requests_approval_rules_protected_branches ( + id bigint NOT NULL, + approval_rule_id bigint, + protected_branch_id bigint, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL +); + +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_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, merge_request_id bigint NOT NULL, @@ -23517,6 +23657,22 @@ 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_rules ALTER COLUMN id SET DEFAULT nextval('merge_requests_approval_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_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_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); ALTER TABLE ONLY merge_requests_compliance_violations ALTER COLUMN id SET DEFAULT nextval('merge_requests_compliance_violations_id_seq'::regclass); @@ -25917,6 +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_rules_groups + ADD CONSTRAINT merge_requests_approval_rules_groups_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); @@ -29031,6 +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_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_merge_requests_on_merge_request_id ON merge_requests_approval_rules_merge_requests USING btree (merge_request_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); @@ -30929,6 +31131,14 @@ 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_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_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); CREATE INDEX index_merge_requests_closing_issues_on_merge_request_id ON merge_requests_closing_issues USING btree (merge_request_id); @@ -36010,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; @@ -36166,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; @@ -36541,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; @@ -37201,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; @@ -37375,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; @@ -37660,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; @@ -37837,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; @@ -37882,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; @@ -37984,6 +38218,9 @@ ALTER TABLE ONLY project_compliance_framework_settings 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; @@ -38719,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; @@ -39019,6 +39259,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 50c08007bd1572e13b97e08278ba3268f0094f2d..49ac3ff5d7d7bb123eeebf3d42ae3b4bdc92b2f7 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::ApprovalRulesGroup', 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 f6f3cfb43cba0e1861669b835834917618217314..334d8c93798559ca392f36d9af594c821102a0de 100644 --- a/ee/app/models/ee/merge_request.rb +++ b/ee/app/models/ee/merge_request.rb @@ -27,7 +27,12 @@ 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::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 -- 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 db53f5bc59ce0f65098426b08afebc358c3a24df..a3eee8878444682d879a1a8e5acfd54ce89724f7 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::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 -- 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_rule.rb b/ee/app/models/merge_requests/approval_rule.rb new file mode 100644 index 0000000000000000000000000000000000000000..d094bd5c99623fbb82975970f5f1860809a0d8b2 --- /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_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_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_rules_projects + has_many :projects, through: :approval_rules_projects + + # When this originated_from_merge_request there's only one merge_request + 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_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 + 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/app/models/merge_requests/approval_rules_group.rb b/ee/app/models/merge_requests/approval_rules_group.rb new file mode 100644 index 0000000000000000000000000000000000000000..a5a9411a7ef5ea56b133fdd90424d68cb2412c05 --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_group.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesGroup < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_groups' + belongs_to :approval_rule + belongs_to :group + end +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 0000000000000000000000000000000000000000..0baeb149c3c3cff13ac4cf9d3a8193202f6f8704 --- /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_rules_project.rb b/ee/app/models/merge_requests/approval_rules_project.rb new file mode 100644 index 0000000000000000000000000000000000000000..a763f611864c738ad82fe8de0629b6de1e4987d4 --- /dev/null +++ b/ee/app/models/merge_requests/approval_rules_project.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module MergeRequests + class ApprovalRulesProject < ApplicationRecord + self.table_name = 'merge_requests_approval_rules_projects' + belongs_to :approval_rule + belongs_to :project + end +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 0000000000000000000000000000000000000000..5d4bccf4b21ffd282a791e868f2592168ecc80f1 --- /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 0000000000000000000000000000000000000000..a533de4663848dff35876a0a79fc4d0e8f1e87d8 --- /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 0000000000000000000000000000000000000000..bb9c4ae8af321dfa72ffb728b9fe0cfd81d5f145 --- /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 0000000000000000000000000000000000000000..8957150e1bab9df25b5e61f937ae530311d47705 --- /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_rules.rb b/ee/spec/factories/merge_requests/approval_rules.rb new file mode 100644 index 0000000000000000000000000000000000000000..033c7435bb93da487058aebc9735e79355eb31c8 --- /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/factories/merge_requests/approval_rules_groups.rb b/ee/spec/factories/merge_requests/approval_rules_groups.rb new file mode 100644 index 0000000000000000000000000000000000000000..fb8212dd5ea6cce4a3284bf88a2db073cdfb04eb --- /dev/null +++ b/ee/spec/factories/merge_requests/approval_rules_groups.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :merge_requests_approval_rules_group, class: 'MergeRequests::ApprovalRulesGroup' do + association :approval_rule, factory: :merge_requests_approval_rule + association :group, factory: :group + end +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 0000000000000000000000000000000000000000..926ed80982ba3a3977a10e8e9f0747ca39169d47 --- /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 0000000000000000000000000000000000000000..73d07b0e9ade1fb6d37ac895ff43daf4658130d5 --- /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 0000000000000000000000000000000000000000..be050456f1e9e6408d64200b21a5dea38ab1b816 --- /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 0000000000000000000000000000000000000000..537ed9b86b0dabe6a38a8efede255853ecf59f9c --- /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 0000000000000000000000000000000000000000..599052024bf26eeffbf14a5647bc75d01fb51bc6 --- /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 0000000000000000000000000000000000000000..79eca39a854deb7a6096cf0cea6f6621155be4c2 --- /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 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 0000000000000000000000000000000000000000..f50c2ff44f8860393286577a861df77dd6b4380b --- /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 0000000000000000000000000000000000000000..7fae275ff36acb69ca4b3a0b79216cc16ecea31f --- /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 0000000000000000000000000000000000000000..1ba5967d01f58e1e7dd2ddf3159ecd3ca57ceeb0 --- /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 0000000000000000000000000000000000000000..786e1898d817d5c02345d10d4c4ff120c640894d --- /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