Create Packages::Nuget::Package class
Context
Step by step we want to complete the refactoring and extract every package format from Packages::Package to its own class.
What does this MR do and why?
This MR introduces Packages::Nuget::Package class for NuGet packages.
NuGet package registry is in GA https://docs.gitlab.com/ee/user/packages/nuget_repository/, hence the changes are introduced with the feature flag.
References
Please include cross links to any resources that are relevant to this MR This will give reviewers and future readers helpful context to give an efficient review of the changes introduced.
- Create Nuget package class (#435826 - closed)
- Decouple package formats with format-specific c... (&12294 - closed)
MR acceptance checklist
Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Screenshots or screen recordings
No.
Database analysis
-
Packages::Nuget::PackageFinderapp/finders/packages/nuget/package_finder.rb
With project. master branch
SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."project_id" = XXX
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."package_type" = 4
AND "packages_packages"."version" IS NOT NULL
AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101976
With project. Current MR
SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."project_id" = XXX
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101974
With group. master branch
SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."project_id" IN
(SELECT "projects"."id"
FROM "projects"
WHERE (EXISTS
(SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = XXX
AND (project_authorizations.project_id = projects.id)
AND (project_authorizations.access_level >= 20))
OR projects.visibility_level IN (10,
20)
OR EXISTS
(SELECT 1
FROM "project_features"
WHERE "project_features"."project_id" = "projects"."id"
AND "project_features"."package_registry_access_level" = 30))
AND "projects"."namespace_id" IN
(SELECT "namespaces"."id"
FROM "namespaces"
WHERE "namespaces"."type" = 'Group'
AND (traversal_ids @> ('{XXX}'))))
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."package_type" = 4
AND "packages_packages"."version" IS NOT NULL
AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101984
With group. Current MR
SELECT "packages_packages".*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."project_id" IN
(SELECT "projects"."id"
FROM "projects"
WHERE (EXISTS
(SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = XXX
AND (project_authorizations.project_id = projects.id)
AND (project_authorizations.access_level >= 20))
OR projects.visibility_level IN (10,
20)
OR EXISTS
(SELECT 1
FROM "project_features"
WHERE "project_features"."project_id" = "projects"."id"
AND "project_features"."package_registry_access_level" = 30))
AND "projects"."namespace_id" IN
(SELECT "namespaces"."id"
FROM "namespaces"
WHERE "namespaces"."type" = 'Group'
AND (traversal_ids @> ('{XXX}'))))
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND LOWER("packages_packages"."name") = 'XXX'
ORDER BY "packages_packages"."created_at" DESC
LIMIT 50;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101981
-
Packages::Nuget::SearchServiceapp/services/packages/nuget/search_service.rb
With project. master branch
SELECT partition_subquery.id,
partition_subquery.project_id,
partition_subquery.created_at,
partition_subquery.updated_at,
partition_subquery.name,
partition_subquery.version,
partition_subquery.package_type,
partition_subquery.creator_id,
partition_subquery.status,
partition_subquery.last_downloaded_at,
partition_subquery.status_message
FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
ORDER BY packages_packages.created_at DESC) AS row_number,
packages_packages.*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."name" IN
(SELECT DISTINCT "packages_packages"."name"
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" = XXX
AND "packages_packages"."name" ILIKE '%XXX%'
ORDER BY "packages_packages"."name" ASC
LIMIT 5
OFFSET 0)
AND "packages_packages"."project_id" = XXX) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102001
SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" = XXX
AND "packages_packages"."name" ILIKE '%XXX%';
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102028
With project. Current MR
SELECT partition_subquery.id,
partition_subquery.project_id,
partition_subquery.created_at,
partition_subquery.updated_at,
partition_subquery.name,
partition_subquery.version,
partition_subquery.package_type,
partition_subquery.creator_id,
partition_subquery.status,
partition_subquery.last_downloaded_at,
partition_subquery.status_message
FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
ORDER BY packages_packages.created_at DESC) AS row_number,
packages_packages.*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."name" IN
(SELECT DISTINCT "packages_packages"."name"
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" = XXX
AND "packages_packages"."name" ILIKE '%XXX%'
ORDER BY "packages_packages"."name" ASC
LIMIT 5
OFFSET 0)
AND "packages_packages"."project_id" = XXX) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/101998
SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" = XXX
AND "packages_packages"."name" ILIKE '%XXX%';
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102031
With group. master branch
WITH "project_ids" AS MATERIALIZED
(SELECT "projects"."id"
FROM "projects"
WHERE (EXISTS
(SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = XXX
AND (project_authorizations.project_id = projects.id)
AND (project_authorizations.access_level >= 20))
OR projects.visibility_level IN (10, 20)
OR EXISTS
(SELECT 1
FROM "project_features"
WHERE "project_features"."project_id" = "projects"."id"
AND "project_features"."package_registry_access_level" = 30))
AND "projects"."namespace_id" IN
(SELECT "namespaces"."id"
FROM "namespaces"
WHERE "namespaces"."type" = 'Group'
AND (traversal_ids @> ('{XXX}'))))
SELECT partition_subquery.id,
partition_subquery.project_id,
partition_subquery.created_at,
partition_subquery.updated_at,
partition_subquery.name,
partition_subquery.version,
partition_subquery.package_type,
partition_subquery.creator_id,
partition_subquery.status,
partition_subquery.last_downloaded_at,
partition_subquery.status_message
FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
ORDER BY packages_packages.created_at DESC) AS row_number,
packages_packages.*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."name" IN
(SELECT DISTINCT "packages_packages"."name"
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" IN
(SELECT "id"
FROM "project_ids")
AND "packages_packages"."name" ILIKE '%XXX%'
ORDER BY "packages_packages"."name" ASC
LIMIT 5
OFFSET 0)
AND "packages_packages"."project_id" IN
(SELECT "id"
FROM "project_ids")) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102014
WITH "project_ids" AS MATERIALIZED
(SELECT "projects"."id"
FROM "projects"
WHERE (EXISTS
(SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = XXX
AND (project_authorizations.project_id = projects.id)
AND (project_authorizations.access_level >= 20))
OR projects.visibility_level IN (10, 20)
OR EXISTS
(SELECT 1
FROM "project_features"
WHERE "project_features"."project_id" = "projects"."id"
AND "project_features"."package_registry_access_level" = 30))
AND "projects"."namespace_id" IN
(SELECT "namespaces"."id"
FROM "namespaces"
WHERE "namespaces"."type" = 'Group'
AND (traversal_ids @> ('{XXX}'))))
SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" IN
(SELECT "id"
FROM "project_ids")
AND "packages_packages"."name" ILIKE '%XXX%';
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102016
With group. Current MR
WITH "project_ids" AS MATERIALIZED
(SELECT "projects"."id"
FROM "projects"
WHERE (EXISTS
(SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = XXX
AND (project_authorizations.project_id = projects.id)
AND (project_authorizations.access_level >= 20))
OR projects.visibility_level IN (10, 20)
OR EXISTS
(SELECT 1
FROM "project_features"
WHERE "project_features"."project_id" = "projects"."id"
AND "project_features"."package_registry_access_level" = 30))
AND "projects"."namespace_id" IN
(SELECT "namespaces"."id"
FROM "namespaces"
WHERE "namespaces"."type" = 'Group'
AND (traversal_ids @> ('{XXX}'))))
SELECT partition_subquery.id,
partition_subquery.project_id,
partition_subquery.created_at,
partition_subquery.updated_at,
partition_subquery.name,
partition_subquery.version,
partition_subquery.package_type,
partition_subquery.creator_id,
partition_subquery.status,
partition_subquery.last_downloaded_at,
partition_subquery.status_message
FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY packages_packages.name
ORDER BY packages_packages.created_at DESC) AS row_number,
packages_packages.*
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."name" IN
(SELECT DISTINCT "packages_packages"."name"
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" IN
(SELECT "id"
FROM "project_ids")
AND "packages_packages"."name" ILIKE '%XXX%'
ORDER BY "packages_packages"."name" ASC
LIMIT 5
OFFSET 0)
AND "packages_packages"."project_id" IN
(SELECT "id"
FROM "project_ids")) partition_subquery
WHERE "partition_subquery"."row_number" <= 10;
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102010
WITH "project_ids" AS MATERIALIZED
(SELECT "projects"."id"
FROM "projects"
WHERE (EXISTS
(SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = XXX
AND (project_authorizations.project_id = projects.id)
AND (project_authorizations.access_level >= 20))
OR projects.visibility_level IN (10, 20)
OR EXISTS
(SELECT 1
FROM "project_features"
WHERE "project_features"."project_id" = "projects"."id"
AND "project_features"."package_registry_access_level" = 30))
AND "projects"."namespace_id" IN
(SELECT "namespaces"."id"
FROM "namespaces"
WHERE "namespaces"."type" = 'Group'
AND (traversal_ids @> ('{XXX}'))))
SELECT COUNT(DISTINCT "packages_packages"."name")
FROM "packages_packages"
WHERE "packages_packages"."package_type" = 4
AND "packages_packages"."status" IN (0,
1)
AND "packages_packages"."version" IS NOT NULL
AND "packages_packages"."project_id" IN
(SELECT "id"
FROM "project_ids")
AND "packages_packages"."name" ILIKE '%XXX%';
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/33075/commands/102023
How to set up and validate locally
- Enable the feature flag:
Feature.enable(:nuget_extract_nuget_package_model) - Try basic package registry actions like publishing and installing a package docs.
Related to #435826 (closed)