2020-12-04 10:09:36 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
#
|
|
|
|
# NuGet Package Manager Client API
|
|
|
|
#
|
|
|
|
# These API endpoints are not consumed directly by users, so there is no documentation for the
|
|
|
|
# individual endpoints. They are called by the NuGet package manager client when users run commands
|
|
|
|
# like `nuget install` or `nuget push`. The usage of the GitLab NuGet registry is documented here:
|
|
|
|
# https://docs.gitlab.com/ee/user/packages/nuget_repository/
|
|
|
|
#
|
|
|
|
# Technical debt: https://gitlab.com/gitlab-org/gitlab/issues/35798
|
|
|
|
module API
|
|
|
|
module Concerns
|
|
|
|
module Packages
|
|
|
|
module NugetEndpoints
|
|
|
|
extend ActiveSupport::Concern
|
|
|
|
|
|
|
|
POSITIVE_INTEGER_REGEX = %r{\A[1-9]\d*\z}.freeze
|
2021-01-07 13:10:38 -05:00
|
|
|
NON_NEGATIVE_INTEGER_REGEX = %r{\A(0|[1-9]\d*)\z}.freeze
|
2020-12-04 10:09:36 -05:00
|
|
|
|
|
|
|
included do
|
|
|
|
helpers do
|
2020-12-29 07:10:19 -05:00
|
|
|
def find_packages(package_name)
|
|
|
|
packages = package_finder(package_name).execute
|
2020-12-04 10:09:36 -05:00
|
|
|
|
|
|
|
not_found!('Packages') unless packages.exists?
|
|
|
|
|
|
|
|
packages
|
|
|
|
end
|
|
|
|
|
2020-12-29 07:10:19 -05:00
|
|
|
def find_package(package_name, package_version)
|
|
|
|
package = package_finder(package_name, package_version).execute
|
|
|
|
.first
|
2020-12-04 10:09:36 -05:00
|
|
|
|
|
|
|
not_found!('Package') unless package
|
|
|
|
|
|
|
|
package
|
|
|
|
end
|
|
|
|
|
2020-12-29 07:10:19 -05:00
|
|
|
def package_finder(package_name, package_version = nil)
|
2020-12-04 10:09:36 -05:00
|
|
|
::Packages::Nuget::PackageFinder.new(
|
2020-12-29 07:10:19 -05:00
|
|
|
current_user,
|
|
|
|
project_or_group,
|
|
|
|
package_name: package_name,
|
|
|
|
package_version: package_version
|
2020-12-04 10:09:36 -05:00
|
|
|
)
|
|
|
|
end
|
2020-12-29 07:10:19 -05:00
|
|
|
|
|
|
|
def search_packages(search_term, search_options)
|
|
|
|
::Packages::Nuget::SearchService
|
|
|
|
.new(current_user, project_or_group, params[:q], search_options)
|
|
|
|
.execute
|
|
|
|
end
|
2020-12-04 10:09:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# https://docs.microsoft.com/en-us/nuget/api/service-index
|
|
|
|
desc 'The NuGet Service Index' do
|
|
|
|
detail 'This feature was introduced in GitLab 12.6'
|
|
|
|
end
|
|
|
|
get 'index', format: :json do
|
2020-12-29 07:10:19 -05:00
|
|
|
authorize_read_package!(project_or_group)
|
2020-12-04 10:09:36 -05:00
|
|
|
track_package_event('cli_metadata', :nuget, category: 'API::NugetPackages')
|
|
|
|
|
2020-12-29 07:10:19 -05:00
|
|
|
present ::Packages::Nuget::ServiceIndexPresenter.new(project_or_group),
|
|
|
|
with: ::API::Entities::Nuget::ServiceIndex
|
2020-12-04 10:09:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# https://docs.microsoft.com/en-us/nuget/api/registration-base-url-resource
|
|
|
|
params do
|
|
|
|
requires :package_name, type: String, desc: 'The NuGet package name', regexp: API::NO_SLASH_URL_PART_REGEX
|
|
|
|
end
|
|
|
|
namespace '/metadata/*package_name' do
|
2020-12-29 07:10:19 -05:00
|
|
|
after_validation do
|
|
|
|
authorize_read_package!(project_or_group)
|
2020-12-04 10:09:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'The NuGet Metadata Service - Package name level' do
|
|
|
|
detail 'This feature was introduced in GitLab 12.8'
|
|
|
|
end
|
|
|
|
get 'index', format: :json do
|
2020-12-29 07:10:19 -05:00
|
|
|
present ::Packages::Nuget::PackagesMetadataPresenter.new(find_packages(params[:package_name])),
|
2020-12-04 10:09:36 -05:00
|
|
|
with: ::API::Entities::Nuget::PackagesMetadata
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'The NuGet Metadata Service - Package name and version level' do
|
|
|
|
detail 'This feature was introduced in GitLab 12.8'
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :package_version, type: String, desc: 'The NuGet package version', regexp: API::NO_SLASH_URL_PART_REGEX
|
|
|
|
end
|
|
|
|
get '*package_version', format: :json do
|
2020-12-29 07:10:19 -05:00
|
|
|
present ::Packages::Nuget::PackageMetadataPresenter.new(find_package(params[:package_name], params[:package_version])),
|
2020-12-04 10:09:36 -05:00
|
|
|
with: ::API::Entities::Nuget::PackageMetadata
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource
|
|
|
|
params do
|
|
|
|
requires :q, type: String, desc: 'The search term'
|
|
|
|
optional :skip, type: Integer, desc: 'The number of results to skip', default: 0, regexp: NON_NEGATIVE_INTEGER_REGEX
|
|
|
|
optional :take, type: Integer, desc: 'The number of results to return', default: Kaminari.config.default_per_page, regexp: POSITIVE_INTEGER_REGEX
|
|
|
|
optional :prerelease, type: ::Grape::API::Boolean, desc: 'Include prerelease versions', default: true
|
|
|
|
end
|
|
|
|
namespace '/query' do
|
2020-12-29 07:10:19 -05:00
|
|
|
after_validation do
|
|
|
|
authorize_read_package!(project_or_group)
|
2020-12-04 10:09:36 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'The NuGet Search Service' do
|
|
|
|
detail 'This feature was introduced in GitLab 12.8'
|
|
|
|
end
|
|
|
|
get format: :json do
|
|
|
|
search_options = {
|
|
|
|
include_prerelease_versions: params[:prerelease],
|
|
|
|
per_page: params[:take],
|
|
|
|
padding: params[:skip]
|
|
|
|
}
|
2020-12-29 07:10:19 -05:00
|
|
|
|
|
|
|
results = search_packages(params[:q], search_options)
|
2020-12-04 10:09:36 -05:00
|
|
|
|
|
|
|
track_package_event('search_package', :nuget, category: 'API::NugetPackages')
|
|
|
|
|
2020-12-29 07:10:19 -05:00
|
|
|
present ::Packages::Nuget::SearchResultsPresenter.new(results),
|
|
|
|
with: ::API::Entities::Nuget::SearchResults
|
2020-12-04 10:09:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|