diff --git a/app/graphql/queries/container_registry/get_container_repositories.query.graphql b/app/graphql/queries/container_registry/get_container_repositories.query.graphql index 17fddd4d6be3f0aa3d3824ecc0927488db00ae2b..c3aa9cbd2bca951d453604bdab800d85a9650957 100644 --- a/app/graphql/queries/container_registry/get_container_repositories.query.graphql +++ b/app/graphql/queries/container_registry/get_container_repositories.query.graphql @@ -69,7 +69,6 @@ query getProjectContainerRepositories( path status location - canDelete createdAt expirationPolicyStartedAt expirationPolicyCleanupStatus diff --git a/app/graphql/types/container_repository_details_type.rb b/app/graphql/types/container_repository_details_type.rb index 3c5e010efc888b30686a390d9955d8099f7b4389..0ecfc5d35b09c2a9208d55a9b38b2b83196c80e6 100644 --- a/app/graphql/types/container_repository_details_type.rb +++ b/app/graphql/types/container_repository_details_type.rb @@ -29,10 +29,6 @@ class ContainerRepositoryDetailsType < Types::ContainerRepositoryType null: true, description: 'Deduplicated size of the image repository in bytes. This is only available on GitLab.com for repositories created after `2021-11-04`.' - def can_delete - Ability.allowed?(current_user, :destroy_container_image, object) - end - def size handling_errors { object.size } end diff --git a/app/graphql/types/container_repository_tag_type.rb b/app/graphql/types/container_repository_tag_type.rb index 7691844645a6c71f51f7b67fee0202e0e25ee7c2..3fa08ed09b261a12b5049045d95b7361a4579958 100644 --- a/app/graphql/types/container_repository_tag_type.rb +++ b/app/graphql/types/container_repository_tag_type.rb @@ -10,13 +10,6 @@ class ContainerRepositoryTagType < BaseObject expose_permissions Types::PermissionTypes::ContainerRepositoryTag - field :can_delete, GraphQL::Types::Boolean, - null: false, - deprecated: { - reason: 'Use `userPermissions` field. See `ContainerRepositoryTagPermissions` type', - milestone: '16.7' - }, - description: 'Can the current user delete this tag.' field :created_at, Types::TimeType, null: true, description: 'Timestamp when the tag was created.' field :digest, GraphQL::Types::String, null: true, description: 'Digest of the tag.' field :location, GraphQL::Types::String, null: false, description: 'URL of the tag.' @@ -27,9 +20,5 @@ class ContainerRepositoryTagType < BaseObject field :revision, GraphQL::Types::String, null: true, description: 'Revision of the tag.' field :short_revision, GraphQL::Types::String, null: true, description: 'Short revision of the tag.' field :total_size, GraphQL::Types::BigInt, null: true, description: 'Size of the tag.' - - def can_delete - Ability.allowed?(current_user, :destroy_container_image, object) - end end end diff --git a/app/graphql/types/container_repository_type.rb b/app/graphql/types/container_repository_type.rb index c2a7eae5f9418fa271e99c2856ab632e302ffb44..f97e2a76192a2688305010ff0e33f03248621d40 100644 --- a/app/graphql/types/container_repository_type.rb +++ b/app/graphql/types/container_repository_type.rb @@ -10,13 +10,6 @@ class ContainerRepositoryType < BaseObject expose_permissions Types::PermissionTypes::ContainerRepository - field :can_delete, GraphQL::Types::Boolean, - null: false, - deprecated: { - reason: 'Use `userPermissions` field. See `ContainerRepositoryPermissions` type', - milestone: '16.7' - }, - description: 'Can the current user delete the container repository.' field :created_at, Types::TimeType, null: false, description: 'Timestamp when the container repository was created.' field :expiration_policy_cleanup_status, Types::ContainerRepositoryCleanupStatusEnum, null: true, description: 'Tags cleanup status for the container repository.' field :expiration_policy_started_at, Types::TimeType, null: true, description: 'Timestamp when the cleanup done by the expiration policy was started on the container repository.' @@ -31,10 +24,6 @@ class ContainerRepositoryType < BaseObject field :tags_count, GraphQL::Types::Int, null: false, description: 'Number of tags associated with this image.' field :updated_at, Types::TimeType, null: false, description: 'Timestamp when the container repository was updated.' - def can_delete - Ability.allowed?(current_user, :update_container_image, object) - end - def project Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find end diff --git a/app/graphql/types/packages/package_base_type.rb b/app/graphql/types/packages/package_base_type.rb index 278119c78e245e077c3f695ebe2f548e970c221e..1ab04223f7701e73f9d6202e001b7020a565b969 100644 --- a/app/graphql/types/packages/package_base_type.rb +++ b/app/graphql/types/packages/package_base_type.rb @@ -16,13 +16,6 @@ class PackageBaseType < ::Types::BaseObject field :_links, Types::Packages::PackageLinksType, null: false, method: :itself, description: 'Map of links to perform actions on the package.' - field :can_destroy, GraphQL::Types::Boolean, - null: false, - deprecated: { - reason: 'Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type', - milestone: '16.6' - }, - description: 'Whether the user can destroy the package.' field :created_at, Types::TimeType, null: false, description: 'Date of creation.' field :metadata, Types::Packages::MetadataType, null: true, @@ -46,10 +39,6 @@ def project Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find end - def can_destroy - Ability.allowed?(current_user, :destroy_package, object) - end - def package_protection_rule_exists return false if Feature.disabled?(:packages_protected_packages, object.project) diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index af5601e9db4cf020a7515f58610e8c52f0753e2f..e2304f6c1ccdae6eb152d75418828fd7e4a9b184 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -18170,7 +18170,6 @@ A container repository. | Name | Type | Description | | ---- | ---- | ----------- | -| <a id="containerrepositorycandelete"></a>`canDelete` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.7. Use `userPermissions` field. See `ContainerRepositoryPermissions` type. | | <a id="containerrepositorycreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp when the container repository was created. | | <a id="containerrepositoryexpirationpolicycleanupstatus"></a>`expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | Tags cleanup status for the container repository. | | <a id="containerrepositoryexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. | @@ -18194,7 +18193,6 @@ Details of a container repository. | Name | Type | Description | | ---- | ---- | ----------- | -| <a id="containerrepositorydetailscandelete"></a>`canDelete` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.7. Use `userPermissions` field. See `ContainerRepositoryPermissions` type. | | <a id="containerrepositorydetailscreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp when the container repository was created. | | <a id="containerrepositorydetailsexpirationpolicycleanupstatus"></a>`expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | Tags cleanup status for the container repository. | | <a id="containerrepositorydetailsexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. | @@ -18296,7 +18294,6 @@ A tag from a container repository. | Name | Type | Description | | ---- | ---- | ----------- | -| <a id="containerrepositorytagcandelete"></a>`canDelete` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.7. Use `userPermissions` field. See `ContainerRepositoryTagPermissions` type. | | <a id="containerrepositorytagcreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp when the tag was created. | | <a id="containerrepositorytagdigest"></a>`digest` | [`String`](#string) | Digest of the tag. | | <a id="containerrepositorytaglocation"></a>`location` | [`String!`](#string) | URL of the tag. | @@ -25686,7 +25683,6 @@ Represents a package with pipelines in the Package Registry. | Name | Type | Description | | ---- | ---- | ----------- | | <a id="package_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. | -| <a id="packagecandestroy"></a>`canDestroy` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.6. Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type. | | <a id="packagecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. | | <a id="packageid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. | | <a id="packagemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. | @@ -25711,7 +25707,6 @@ Represents a package in the Package Registry. | Name | Type | Description | | ---- | ---- | ----------- | | <a id="packagebase_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. | -| <a id="packagebasecandestroy"></a>`canDestroy` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.6. Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type. | | <a id="packagebasecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. | | <a id="packagebaseid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. | | <a id="packagebasemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. | @@ -25773,7 +25768,6 @@ Represents a package details in the Package Registry. | Name | Type | Description | | ---- | ---- | ----------- | | <a id="packagedetailstype_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. | -| <a id="packagedetailstypecandestroy"></a>`canDestroy` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.6. Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type. | | <a id="packagedetailstypecomposerconfigrepositoryurl"></a>`composerConfigRepositoryUrl` | [`String`](#string) | Url of the Composer setup endpoint. | | <a id="packagedetailstypecomposerurl"></a>`composerUrl` | [`String`](#string) | Url of the Composer endpoint. | | <a id="packagedetailstypeconanurl"></a>`conanUrl` | [`String`](#string) | Url of the Conan project endpoint. | diff --git a/spec/fixtures/api/schemas/graphql/container_repository.json b/spec/fixtures/api/schemas/graphql/container_repository.json index 95cc5e28b345130dbc60cb8bed0b2a6a48e84453..1fa7f17ab004b651e9f8aed08a4272b9a8d93716 100644 --- a/spec/fixtures/api/schemas/graphql/container_repository.json +++ b/spec/fixtures/api/schemas/graphql/container_repository.json @@ -8,7 +8,6 @@ "createdAt", "updatedAt", "tagsCount", - "canDelete", "expirationPolicyCleanupStatus", "project", "lastCleanupDeletedTagsCount", @@ -48,9 +47,6 @@ "tagsCount": { "type": "integer" }, - "canDelete": { - "type": "boolean" - }, "expirationPolicyCleanupStatus": { "type": "string", "enum": [ diff --git a/spec/fixtures/api/schemas/graphql/container_repository_details.json b/spec/fixtures/api/schemas/graphql/container_repository_details.json index dccdd85274d92f27d1597c058bb841593c6b7a7e..1b9c4493693b656b734f6a0ca838ea7197931b70 100644 --- a/spec/fixtures/api/schemas/graphql/container_repository_details.json +++ b/spec/fixtures/api/schemas/graphql/container_repository_details.json @@ -23,7 +23,6 @@ "name", "path", "location", - "canDelete", "userPermissions" ], "properties": { @@ -51,9 +50,6 @@ "createdAt": { "type": "string" }, - "canDelete": { - "type": "boolean" - }, "userPermissions": { "type": "object", "additionalProperties": false, diff --git a/spec/fixtures/api/schemas/graphql/packages/package_details.json b/spec/fixtures/api/schemas/graphql/packages/package_details.json index d01d75fcd46ddadf0aff5da7e080e1aca122d36f..5ab84cb2b351da5ae2896ba9b93c8c9af42c3d52 100644 --- a/spec/fixtures/api/schemas/graphql/packages/package_details.json +++ b/spec/fixtures/api/schemas/graphql/packages/package_details.json @@ -15,7 +15,6 @@ "versions", "status", "statusMessage", - "canDestroy", "lastDownloadedAt", "_links", "userPermissions" @@ -39,11 +38,6 @@ "null" ] }, - "canDestroy": { - "type": [ - "boolean" - ] - }, "packageType": { "type": [ "string" diff --git a/spec/graphql/types/container_repository_details_type_spec.rb b/spec/graphql/types/container_repository_details_type_spec.rb index 75c2078a092776a45263028e331dcae7df6de1c3..61663f65b0e55814290e35b29998b8316f2d5750 100644 --- a/spec/graphql/types/container_repository_details_type_spec.rb +++ b/spec/graphql/types/container_repository_details_type_spec.rb @@ -2,9 +2,9 @@ require 'spec_helper' -RSpec.describe GitlabSchema.types['ContainerRepositoryDetails'] do +RSpec.describe GitlabSchema.types['ContainerRepositoryDetails'], feature_category: :container_registry do fields = %i[id name path location created_at updated_at expiration_policy_started_at - status tags_count can_delete expiration_policy_cleanup_status tags size manifest + status tags_count expiration_policy_cleanup_status tags size manifest project migration_state last_cleanup_deleted_tags_count userPermissions] it { expect(described_class.graphql_name).to eq('ContainerRepositoryDetails') } diff --git a/spec/graphql/types/container_repository_tag_type_spec.rb b/spec/graphql/types/container_repository_tag_type_spec.rb index 4c91c39fcd6d04e8f6559abfdbd801af12d4cd8f..df623af6e51b9b1e22f5c6817b66e968dba31bac 100644 --- a/spec/graphql/types/container_repository_tag_type_spec.rb +++ b/spec/graphql/types/container_repository_tag_type_spec.rb @@ -4,7 +4,7 @@ RSpec.describe GitlabSchema.types['ContainerRepositoryTag'], feature_category: :container_registry do fields = %i[name path location digest revision short_revision - total_size created_at can_delete user_permissions referrers published_at] + total_size created_at user_permissions referrers published_at] it { expect(described_class.graphql_name).to eq('ContainerRepositoryTag') } diff --git a/spec/graphql/types/container_repository_type_spec.rb b/spec/graphql/types/container_repository_type_spec.rb index 0c7879c3f2ab367f164f8d1e852e23e863c8b859..3d33ed4b6a521cfbf95c4e51dd89d5f5f3aa9f54 100644 --- a/spec/graphql/types/container_repository_type_spec.rb +++ b/spec/graphql/types/container_repository_type_spec.rb @@ -4,7 +4,7 @@ RSpec.describe GitlabSchema.types['ContainerRepository'], feature_category: :container_registry do fields = %i[id name path location created_at updated_at expiration_policy_started_at - status tags_count can_delete expiration_policy_cleanup_status project + status tags_count expiration_policy_cleanup_status project migration_state last_cleanup_deleted_tags_count user_permissions] it { expect(described_class.graphql_name).to eq('ContainerRepository') } diff --git a/spec/graphql/types/packages/package_base_type_spec.rb b/spec/graphql/types/packages/package_base_type_spec.rb index 6b568f4ae7f51899f0f61f682c656ee8e77b5f55..c3319539639bd519c115379f3bba3dc4b49e3b61 100644 --- a/spec/graphql/types/packages/package_base_type_spec.rb +++ b/spec/graphql/types/packages/package_base_type_spec.rb @@ -13,7 +13,7 @@ created_at updated_at project tags metadata - status status_message can_destroy + status status_message user_permissions ] diff --git a/spec/graphql/types/packages/package_type_spec.rb b/spec/graphql/types/packages/package_type_spec.rb index dc1cc6a8bada1113fd59be8bcd6a07e298b589c9..934e827cdbe0de872b219d2ec061ce543c2aa5a0 100644 --- a/spec/graphql/types/packages/package_type_spec.rb +++ b/spec/graphql/types/packages/package_type_spec.rb @@ -13,8 +13,7 @@ created_at updated_at project tags pipelines metadata - status can_destroy - user_permissions + status user_permissions ] expect(described_class).to include_graphql_fields(*expected_fields) diff --git a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb index 4d5579407b7c9e951f41e64fe3fce96b9b25db49..70e50554e14c58922a1a4248d0d72f7fb8faca4d 100644 --- a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb +++ b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb @@ -55,7 +55,9 @@ <<~GQL query($id: ContainerRepositoryID!, $n: ContainerRepositoryTagSort) { containerRepository(id: $id) { - canDelete + userPermissions { + destroyContainerRepository + } tags(sort: $n) { edges { node { @@ -68,7 +70,7 @@ GQL end - where(:project_visibility, :role, :access_granted, :can_delete) do + where(:project_visibility, :role, :access_granted, :destroy_container_repository) do :private | :maintainer | true | true :private | :developer | true | true :private | :reporter | true | false @@ -92,7 +94,7 @@ if access_granted expect(tags_response.size).to eq(repository_tags.size) - expect(container_repository_details_response.dig('canDelete')).to eq(can_delete) + expect(container_repository_details_response.dig('userPermissions', 'destroyContainerRepository')).to eq(destroy_container_repository) else expect(container_repository_details_response).to eq(nil) end diff --git a/spec/requests/api/graphql/group/container_repositories_spec.rb b/spec/requests/api/graphql/group/container_repositories_spec.rb index 9206ead153422fa30355c01e78fce7775250855e..5d9c5050add09367e0f7d07a9e0677ed8ae45df4 100644 --- a/spec/requests/api/graphql/group/container_repositories_spec.rb +++ b/spec/requests/api/graphql/group/container_repositories_spec.rb @@ -14,12 +14,12 @@ let_it_be(:container_repositories) { [container_repository, container_repositories_delete_scheduled, container_repositories_delete_failed].flatten } let_it_be(:container_expiration_policy) { project.container_expiration_policy } - let(:excluded_fields) { [] } + let(:excluded_fields) { %w[pipeline jobs productAnalyticsState mlModels] } let(:container_repositories_fields) do <<~GQL edges { node { - #{all_graphql_fields_for('container_repositories'.classify, max_depth: 1, excluded: excluded_fields)} + #{all_graphql_fields_for('container_repositories'.classify, excluded: excluded_fields)} } } GQL @@ -64,7 +64,7 @@ context 'with different permissions' do let_it_be(:user) { create(:user) } - where(:group_visibility, :role, :access_granted, :can_delete) do + where(:group_visibility, :role, :access_granted, :destroy_container_repository) do :private | :maintainer | true | true :private | :developer | true | true :private | :reporter | true | false @@ -91,7 +91,7 @@ if access_granted expect(container_repositories_response.size).to eq(container_repositories.size) container_repositories_response.each do |repository_response| - expect(repository_response.dig('node', 'canDelete')).to eq(can_delete) + expect(repository_response.dig('node', 'userPermissions', 'destroyContainerRepository')).to eq(destroy_container_repository) end else expect(container_repositories_response).to eq(nil) @@ -156,7 +156,7 @@ it_behaves_like 'handling graphql network errors with the container registry' it_behaves_like 'not hitting graphql network errors with the container registry' do - let(:excluded_fields) { %w[tags tagsCount] } + let(:excluded_fields) { %w[pipeline jobs tags tagsCount productAnalyticsState mlModels] } end it 'returns the total count of container repositories' do diff --git a/spec/requests/api/graphql/project/container_repositories_spec.rb b/spec/requests/api/graphql/project/container_repositories_spec.rb index 2307409c383c55e571e1baca04f23ed931b10f78..9a2d1c2317b2b8217e27f0506672dbd093000faa 100644 --- a/spec/requests/api/graphql/project/container_repositories_spec.rb +++ b/spec/requests/api/graphql/project/container_repositories_spec.rb @@ -65,7 +65,7 @@ context 'with different permissions' do let_it_be(:user) { create(:user) } - where(:project_visibility, :role, :access_granted, :can_delete) do + where(:project_visibility, :role, :access_granted, :destroy_container_repository) do :private | :maintainer | true | true :private | :developer | true | true :private | :reporter | true | false @@ -90,7 +90,7 @@ if access_granted expect(container_repositories_response.size).to eq(container_repositories.size) container_repositories_response.each do |repository_response| - expect(repository_response.dig('node', 'canDelete')).to eq(can_delete) + expect(repository_response.dig('node', 'userPermissions', 'destroyContainerRepository')).to eq(destroy_container_repository) end else expect(container_repositories_response).to eq(nil)