diff --git a/app/models/project.rb b/app/models/project.rb index 436834a07969bc39a0c58fe1a50e64b428ffa796..424c61c9cf685aff9813588fb48722f8cb7f88e7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -3111,6 +3111,8 @@ def package_already_taken?(package_name, package_version, package_type:) ).exists? end + # TODO: Remove with the rollout of the FF npm_extract_npm_package_model + # https://gitlab.com/gitlab-org/gitlab/-/issues/501469 def has_namespaced_npm_packages? packages.with_npm_scope(root_namespace.path) .not_pending_destruction diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index da655de35663eaa202840e67fa91276788258601..96fb527fb5245dae34823c3e23dc632b8674f84a 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -94,7 +94,7 @@ def transfer(project) verify_if_container_registry_tags_can_be_handled(project) - if !new_namespace_has_same_root?(project) && project.has_namespaced_npm_packages? + if !new_namespace_has_same_root?(project) && project_has_namespaced_npm_packages? raise TransferError, s_("TransferProject|Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace.") end @@ -331,6 +331,17 @@ def publish_event Gitlab::EventStore.publish(event) end + + def project_has_namespaced_npm_packages? + if Feature.enabled?(:npm_extract_npm_package_model, Feature.current_request) + ::Packages::Npm::Package.for_projects(project) + .with_npm_scope(project.root_namespace.path) + .not_pending_destruction + .exists? + else + project.has_namespaced_npm_packages? + end + end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 9dfb7a88115cace60d568915fbb25b036f7dbfc8..d04efb7de58d58299702bf2053e54d51dd9e5835 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -8222,6 +8222,8 @@ def has_external_wiki end end + # TODO: Remove with the rollout of the FF npm_extract_npm_package_model + # https://gitlab.com/gitlab-org/gitlab/-/issues/501469 describe '#has_namespaced_npm_packages?' do let_it_be(:namespace) { create(:namespace, path: 'test') } let_it_be(:project) { create(:project, :public, namespace: namespace) } diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index a83b72c14aecd62cf918ab46787c90ee51e36a73..c0d348c88ba1db015e6f0abb0d7ff3731b13f700 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -26,21 +26,46 @@ let!(:package) { create(:npm_package, project: project, name: "@testscope/test") } - context 'with a root namespace change' do - it 'allow the transfer' do - expect(transfer_service.execute(group)).to be true + shared_examples 'allow the transfer' do + it 'allows the transfer' do + expect(transfer_service.execute(namespace)).to be true expect(project.errors[:new_namespace]).to be_empty end end + context 'with a root namespace change' do + it_behaves_like 'allow the transfer' do + let(:namespace) { group } + end + + context 'when npm_extract_npm_package_model is disabled' do + before do + stub_feature_flags(npm_extract_npm_package_model: false) + end + + it_behaves_like 'allow the transfer' do + let(:namespace) { group } + end + end + end + context 'with pending destruction package' do before do package.pending_destruction! end - it 'allow the transfer' do - expect(transfer_service.execute(group)).to be true - expect(project.errors[:new_namespace]).to be_empty + it_behaves_like 'allow the transfer' do + let(:namespace) { group } + end + + context 'when npm_extract_npm_package_model is disabled' do + before do + stub_feature_flags(npm_extract_npm_package_model: false) + end + + it_behaves_like 'allow the transfer' do + let(:namespace) { group } + end end end @@ -51,6 +76,17 @@ expect(transfer_service.execute(group)).to be false expect(project.errors[:new_namespace]).to include("Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace.") end + + context 'when npm_extract_npm_package_model is disabled' do + before do + stub_feature_flags(npm_extract_npm_package_model: false) + end + + it 'does not allow the transfer' do + expect(transfer_service.execute(group)).to be false + expect(project.errors[:new_namespace]).to include("Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace.") + end + end end context 'without a root namespace change' do @@ -63,9 +99,18 @@ other_group.add_owner(user) end - it 'allow the transfer' do - expect(transfer_service.execute(other_group)).to be true - expect(project.errors[:new_namespace]).to be_empty + it_behaves_like 'allow the transfer' do + let(:namespace) { other_group } + end + + context 'when npm_extract_npm_package_model is disabled' do + before do + stub_feature_flags(npm_extract_npm_package_model: false) + end + + it_behaves_like 'allow the transfer' do + let(:namespace) { other_group } + end end end end